AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Unit Class Referenceabstract

#include "Unit.h"

Inheritance diagram for Unit:
WorldObject Object WorldLocation Position Creature Player TempSummon Minion Guardian Puppet Totem Pet

Public Types

typedef std::unordered_set< Unit * > AttackerSet
 
typedef std::set< Unit * > ControlSet
 
typedef std::multimap< uint32, Aura * > AuraMap
 
typedef std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
 
typedef std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
 
typedef std::multimap< uint32, AuraApplication * > AuraApplicationMap
 
typedef std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
 
typedef std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
 
typedef std::multimap< AuraStateType, AuraApplication * > AuraStateAurasMap
 
typedef std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
 
typedef std::list< AuraEffect * > AuraEffectList
 
typedef std::list< Aura * > AuraList
 
typedef std::list< AuraApplication * > AuraApplicationList
 
typedef std::list< DiminishingReturnDiminishing
 
typedef GuidUnorderedSet ComboPointHolderSet
 
typedef std::map< uint8, AuraApplication * > VisibleAuraMap
 
typedef std::set< PetAura const * > PetAuraSet
 

Public Member Functions

 ~Unit () override
 
void Update (uint32 time) override
 
UnitAIGetAI ()
 
void SetAI (UnitAI *newAI)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void CleanupBeforeRemoveFromMap (bool finalCleanup)
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
virtual bool isBeingLoaded () const
 
bool IsDuringRemoveFromWorld () const
 
void SetUInt32Value (uint16 index, uint32 value)
 
UnitGetOwner () const
 
ObjectGuid GetOwnerGUID () const
 
void SetOwnerGUID (ObjectGuid owner)
 
ObjectGuid GetCreatorGUID () const
 
void SetCreatorGUID (ObjectGuid creator)
 
ObjectGuid GetMinionGUID () const
 
void SetMinionGUID (ObjectGuid guid)
 
ObjectGuid GetCharmerGUID () const
 
void SetCharmerGUID (ObjectGuid owner)
 
ObjectGuid GetCharmGUID () const
 
void SetPetGUID (ObjectGuid guid)
 
ObjectGuid GetPetGUID () const
 
void SetCritterGUID (ObjectGuid guid)
 
ObjectGuid GetCritterGUID () const
 
ObjectGuid GetTransGUID () const override
 
PetToPet ()
 
TotemToTotem ()
 
TempSummonToTempSummon ()
 
const TempSummonToTempSummon () const
 
void AddUnitState (uint32 f)
 
bool HasUnitState (const uint32 f) const
 
void ClearUnitState (uint32 f)
 
uint32 GetUnitState () const
 
uint32 HasUnitTypeMask (uint32 mask) const
 
void AddUnitTypeMask (uint32 mask)
 
uint32 GetUnitTypeMask () const
 
UnitFlags GetUnitFlags () const
 
bool HasUnitFlag (UnitFlags flags) const
 
void SetUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h. More...
 
void RemoveUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h. More...
 
void ReplaceAllUnitFlags (UnitFlags flags)
 Remove the Unit flag specify only. More...
 
UnitFlags2 GetUnitFlags2 () const
 Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h. More...
 
bool HasUnitFlag2 (UnitFlags2 flags) const
 
void SetUnitFlag2 (UnitFlags2 flags)
 
void RemoveUnitFlag2 (UnitFlags2 flags)
 
void ReplaceAllUnitFlags2 (UnitFlags2 flags)
 
NPCFlags GetNpcFlags () const
 
bool HasNpcFlag (NPCFlags flags) const
 
void SetNpcFlag (NPCFlags flags)
 
void RemoveNpcFlag (NPCFlags flags)
 
void ReplaceAllNpcFlags (NPCFlags flags)
 
uint32 GetDynamicFlags () const override
 
void ReplaceAllDynamicFlags (uint32 flag) override
 
void AddUnitMovementFlag (uint32 f)
 
void RemoveUnitMovementFlag (uint32 f)
 
bool HasUnitMovementFlag (uint32 f) const
 
uint32 GetUnitMovementFlags () const
 
void SetUnitMovementFlags (uint32 f)
 
void AddExtraUnitMovementFlag (uint16 f)
 
void RemoveExtraUnitMovementFlag (uint16 f)
 
uint16 HasExtraUnitMovementFlag (uint16 f) const
 
uint16 GetExtraUnitMovementFlags () const
 
void SetExtraUnitMovementFlags (uint16 f)
 
bool IsSummon () const
 
bool IsGuardian () const
 
bool IsControllableGuardian () const
 
bool IsPet () const
 
bool IsHunterPet () const
 
bool IsTotem () const
 
bool IsVehicle () const
 
bool IsVendor () const
 
bool IsTrainer () const
 
bool IsQuestGiver () const
 
bool IsGossip () const
 
bool IsTaxi () const
 
bool IsGuildMaster () const
 
bool IsBattleMaster () const
 
bool IsBanker () const
 
bool IsInnkeeper () const
 
bool IsSpiritHealer () const
 
bool IsSpiritGuide () const
 
bool IsTabardDesigner () const
 
bool IsAuctioner () const
 
bool IsArmorer () const
 
bool IsServiceProvider () const
 
bool IsSpiritService () const
 
uint32 GetCreatureType () const
 
uint32 GetCreatureTypeMask () const
 
bool IsCritter () const
 
uint8 getRace (bool original=false) const
 
void setRace (uint8 race)
 
uint32 getRaceMask () const
 
DisplayRace GetDisplayRaceFromModelId (uint32 modelId) const
 
DisplayRace GetDisplayRace () const
 
uint8 getClass () const
 
virtual bool IsClass (Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
 
uint32 getClassMask () const
 
uint8 getGender () const
 
uint32 GetFaction () const
 
FactionTemplateEntry const * GetFactionTemplateEntry () const
 
void SetFaction (uint32 faction)
 
void RestoreFaction ()
 
uint32 GetOldFactionId () const
 
ObjectGuid GetTarget () const
 
virtual void SetTarget (ObjectGuid=ObjectGuid::Empty)=0
 
bool isTargetableForAttack (bool checkFakeDeath=true, Unit const *byWho=nullptr) const
 
bool IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell=nullptr) const
 
bool _IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
 
bool IsValidAssistTarget (Unit const *target) const
 
bool _IsValidAssistTarget (Unit const *target, SpellInfo const *bySpell) const
 
float GetCombatReach () const override
 
float GetMeleeReach () const
 
bool IsWithinRange (Unit const *obj, float dist) const
 
bool IsWithinCombatRange (Unit const *obj, float dist2compare) const
 
bool IsWithinMeleeRange (Unit const *obj, float dist=0.f) const
 
float GetMeleeRange (Unit const *target) const
 
void setAttackTimer (WeaponAttackType type, int32 time)
 
void resetAttackTimer (WeaponAttackType type=BASE_ATTACK)
 
int32 getAttackTimer (WeaponAttackType type) const
 
bool isAttackReady (WeaponAttackType type=BASE_ATTACK) const
 
virtual SpellSchoolMask GetMeleeDamageSchoolMask (WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
 
bool GetRandomContactPoint (Unit const *target, float &x, float &y, float &z, bool force=false) const
 
UnitgetAttackerForHelper () const
 
bool Attack (Unit *victim, bool meleeAttack)
 
void CastStop (uint32 except_spellid=0, bool withInstant=true)
 Interrupt the unit cast for all the current spells. More...
 
bool AttackStop ()
 Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client. More...
 
void RemoveAllAttackers ()
 Remove all units in m_attackers list and send them AttackStop() More...
 
AttackerSet const & getAttackers () const
 
bool GetMeleeAttackPoint (Unit *attacker, Position &pos)
 
bool isAttackingPlayer () const
 
UnitGetVictim () const
 
void CombatStop (bool includingCast=false)
 
void CombatStopWithPets (bool includingCast=false)
 
void StopAttackFaction (uint32 faction_id)
 
void StopAttackingInvalidTarget ()
 
UnitSelectNearbyTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
UnitSelectNearbyNoTotemTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
void SendMeleeAttackStop (Unit *victim=nullptr)
 Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead. More...
 
void SendMeleeAttackStart (Unit *victim, Player *sendTo=nullptr)
 
uint32 GetAttackTime (WeaponAttackType att) const
 
void SetAttackTime (WeaponAttackType att, uint32 val)
 
void ApplyAttackTimePercentMod (WeaponAttackType att, float val, bool apply)
 
void ApplyCastTimePercentMod (float val, bool apply)
 
void SetImmuneToAll (bool apply, bool keepCombat=false)
 
bool IsImmuneToAll () const
 
void SetImmuneToPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToPC () const
 
void SetImmuneToNPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToNPC () const
 
bool IsEngaged () const
 
bool IsEngagedBy (Unit const *who) const
 
bool IsInCombat () const
 
bool IsInCombatWith (Unit const *who) const
 
bool IsPetInCombat () const
 
void CombatStart (Unit *target, bool initialAggro=true)
 
void CombatStartOnCast (Unit *target, bool initialAggro=true, uint32 duration=0)
 
void SetInCombatState (bool PvP, Unit *enemy=nullptr, uint32 duration=0)
 
void SetInCombatWith (Unit *enemy, uint32 duration=0)
 
void ClearInCombat ()
 
void ClearInPetCombat ()
 
uint32 GetCombatTimer () const
 
void SetCombatTimer (uint32 timer)
 
bool CanHaveThreatList (bool skipAliveCheck=false) const
 
void AddThreat (Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
 
float ApplyTotalThreatModifier (float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
void TauntApply (Unit *victim)
 
void TauntFadeOut (Unit *taunter)
 
ThreatMgrGetThreatMgr ()
 
ThreatMgr const & GetThreatMgr () const
 
void addHatedBy (HostileReference *pHostileReference)
 
void removeHatedBy (HostileReference *)
 
HostileRefMgrgetHostileRefMgr ()
 
void SetRedirectThreat (ObjectGuid guid, uint32 pct)
 
void ResetRedirectThreat ()
 
void ModifyRedirectThreat (int32 amount)
 
uint32 GetRedirectThreatPercent ()
 
UnitGetRedirectThreatTarget () const
 
void SetLastDamagedTargetGuid (ObjectGuid const &guid)
 
ObjectGuid const & GetLastDamagedTargetGuid () const
 
void AttackerStateUpdate (Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
 
bool haveOffhandWeapon () const
 
bool CanDualWield () const
 
virtual void SetCanDualWield (bool value)
 
virtual bool HasWeapon (WeaponAttackType type) const =0
 
bool HasMainhandWeapon () const
 
bool HasOffhandWeapon () const
 
bool HasRangedWeapon () const
 
bool hasMainhandWeaponForAttack () const
 
virtual bool HasWeaponForAttack (WeaponAttackType type) const
 
bool HasMainhandWeaponForAttack () const
 
bool HasOffhandWeaponForAttack () const
 
bool HasRangedWeaponForAttack () const
 
bool CanUseAttackType (uint8 attacktype) const
 
void HandleProcExtraAttackFor (Unit *victim, uint32 count)
 
void SetLastExtraAttackSpell (uint32 spellId)
 
uint32 GetLastExtraAttackSpell () const
 
void AddExtraAttacks (uint32 count)
 
uint8 GetComboPoints (Unit const *who=nullptr) const
 
uint8 GetComboPoints (ObjectGuid const &guid) const
 
UnitGetComboTarget () const
 
ObjectGuid const GetComboTargetGUID () const
 
void AddComboPoints (Unit *target, int8 count)
 
void AddComboPoints (int8 count)
 
void ClearComboPoints ()
 
void AddComboPointHolder (Unit *unit)
 
void RemoveComboPointHolder (Unit *unit)
 
void ClearComboPointHolders ()
 
void SetContestedPvP (Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
 
bool IsContestedGuard () const
 
bool IsInSanctuary () const
 
bool IsPvP () const
 
bool IsFFAPvP () const
 
void SetPvP (bool state)
 
float GetStat (Stats stat) const
 
void SetStat (Stats stat, int32 val)
 
Stats GetStatByAuraGroup (UnitMods unitMod) const
 
float GetCreateStat (Stats stat) const
 
void SetCreateStat (Stats stat, float val)
 
float GetPosStat (Stats stat) const
 
float GetNegStat (Stats stat) const
 
void InitStatBuffMods ()
 
bool HandleStatModifier (UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply)
 
void SetModifierValue (UnitMods unitMod, UnitModifierType modifierType, float value)
 
float GetModifierValue (UnitMods unitMod, UnitModifierType modifierType) const
 
float GetTotalStatValue (Stats stat, float additionalValue=0.0f) const
 
void SetCanModifyStats (bool modifyStats)
 
bool CanModifyStats () const
 
void ApplyStatBuffMod (Stats stat, float val, bool apply)
 
void ApplyStatPercentBuffMod (Stats stat, float val, bool apply)
 
uint8 GetLevel () const
 
uint8 getLevelForTarget (WorldObject const *) const override
 
void SetLevel (uint8 lvl, bool showLevelChange=true)
 
uint32 GetHealth () const
 
uint32 GetMaxHealth () const
 
float GetHealthPct () const
 
int32 GetHealthGain (int32 dVal)
 
uint32 GetCreateHealth () const
 
bool IsFullHealth () const
 
bool HealthBelowPct (int32 pct) const
 
bool HealthBelowPctDamaged (int32 pct, uint32 damage) const
 
bool HealthAbovePct (int32 pct) const
 
bool HealthAbovePctHealed (int32 pct, uint32 heal) const
 
uint32 CountPctFromMaxHealth (int32 pct) const
 
uint32 CountPctFromCurHealth (int32 pct) const
 
void SetHealth (uint32 val)
 
void SetMaxHealth (uint32 val)
 
void SetFullHealth ()
 
int32 ModifyHealth (int32 val)
 
void SetCreateHealth (uint32 val)
 
Powers getPowerType () const
 
virtual bool HasActivePowerType (Powers power)
 
Powers GetPowerTypeByAuraGroup (UnitMods unitMod) const
 
uint32 GetPower (Powers power) const
 
uint32 GetMaxPower (Powers power) const
 
float GetPowerPct (Powers power) const
 
uint32 GetCreatePowers (Powers power) const
 
void setPowerType (Powers power)
 
void SetPower (Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
 
void SetMaxPower (Powers power, uint32 val)
 
int32 ModifyPower (Powers power, int32 val, bool withPowerUpdate=true)
 
int32 ModifyPowerPct (Powers power, float pct, bool apply=true)
 
void RewardRage (uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
 
uint32 GetCreateMana () const
 
void SetCreateMana (uint32 val)
 
bool CanRestoreMana (SpellInfo const *spellInfo) const
 
void SetLastManaUse (uint32 spellCastTime)
 
bool IsUnderLastManaUseEffect () const
 
float GetAPMultiplier (WeaponAttackType attType, bool normalized)
 
uint32 GetArmor () const
 
void SetArmor (int32 val)
 
float GetUnitDodgeChance () const
 
float GetUnitParryChance () const
 
float GetUnitBlockChance () const
 
float GetUnitMissChance (WeaponAttackType attType) const
 
float GetUnitCriticalChance (WeaponAttackType attackType, Unit const *victim) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const
 
bool CanApplyResilience () const
 
virtual uint32 GetShieldBlockValue () const =0
 
uint32 GetShieldBlockValue (uint32 soft_cap, uint32 hard_cap) const
 
uint32 GetUnitMeleeSkill (Unit const *target=nullptr) const
 
uint32 GetDefenseSkillValue (Unit const *target=nullptr) const
 
uint32 GetWeaponSkillValue (WeaponAttackType attType, Unit const *target=nullptr) const
 
int32 GetMechanicResistChance (SpellInfo const *spell)
 
uint32 GetResistance (SpellSchoolMask mask) const
 
uint32 GetResistance (SpellSchools school) const
 
float GetResistanceBuffMods (SpellSchools school, bool positive) const
 
void SetResistance (SpellSchools school, int32 val)
 
void SetResistanceBuffMods (SpellSchools school, bool positive, float val)
 
void ApplyResistanceBuffModsMod (SpellSchools school, bool positive, float val, bool apply)
 
void ApplyResistanceBuffModsPercentMod (SpellSchools school, bool positive, float val, bool apply)
 
uint16 GetMaxSkillValueForLevel (Unit const *target=nullptr) const
 
float GetTotalAuraModValue (UnitMods unitMod) const
 
SpellSchools GetSpellSchoolByAuraGroup (UnitMods unitMod) const
 
float GetTotalAttackPowerValue (WeaponAttackType attType, Unit *pVictim=nullptr) const
 
float GetWeaponDamageRange (WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
 
void SetBaseWeaponDamage (WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
 
virtual bool UpdateStats (Stats stat)=0
 
virtual bool UpdateAllStats ()=0
 
virtual void UpdateResistances (uint32 school)=0
 
virtual void UpdateAllResistances ()
 
virtual void UpdateArmor ()=0
 
virtual void UpdateMaxHealth ()=0
 
virtual void UpdateMaxPower (Powers power)=0
 
virtual void UpdateAttackPowerAndDamage (bool ranged=false)=0
 
virtual void UpdateDamagePhysical (WeaponAttackType attType)
 
void DealMeleeDamage (CalcDamageInfo *damageInfo, bool durabilityLoss)
 
void DealSpellDamage (SpellNonMeleeDamage *damageInfo, bool durabilityLoss, Spell const *spell=nullptr)
 
void KillSelf (bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
uint32 CalculateDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
 
virtual void CalculateMinMaxDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0
 
void CalculateMeleeDamage (Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
 
void CalculateSpellDamageTaken (SpellNonMeleeDamage *damageInfo, int32 damage, SpellInfo const *spellInfo, WeaponAttackType attackType=BASE_ATTACK, bool crit=false)
 
int32 CalculateSpellDamage (Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
 
float CalculateDefaultCoefficient (SpellInfo const *spellInfo, DamageEffectType damagetype) const
 
uint32 MeleeDamageBonusDone (Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
uint32 MeleeDamageBonusTaken (Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
int32 SpellBaseDamageBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseDamageBonusTaken (SpellSchoolMask schoolMask, bool isDoT=false)
 
float SpellPctDamageModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellDamageBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellDamageBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
 
int32 CalculateAOEDamageReduction (int32 damage, uint32 schoolMask, Unit *caster) const
 
uint32 GetMeleeDamageReduction (uint32 damage) const
 
uint32 GetRangedDamageReduction (uint32 damage) const
 
uint32 GetSpellDamageReduction (uint32 damage) const
 
float GetMeleeCritChanceReduction () const
 
float GetRangedCritChanceReduction () const
 
float GetSpellCritChanceReduction () const
 
uint32 GetMeleeCritDamageReduction (uint32 damage) const
 
uint32 GetRangedCritDamageReduction (uint32 damage) const
 
uint32 GetSpellCritDamageReduction (uint32 damage) const
 
CharmInfoGetCharmInfo ()
 
CharmInfoInitCharmInfo ()
 
UnitGetCharmer () const
 
UnitGetCharm () const
 
UnitGetCharmerOrOwner () const
 
UnitGetCharmerOrOwnerOrSelf () const
 
PlayerGetCharmerOrOwnerPlayerOrPlayerItself () const
 
ObjectGuid GetCharmerOrOwnerGUID () const
 
ObjectGuid GetCharmerOrOwnerOrOwnGUID () const
 
PlayerGetAffectingPlayer () const
 
UnitGetFirstControlled () const
 
bool IsControlledByPlayer () const
 
bool IsCreatedByPlayer () const
 
bool IsCharmedOwnedByPlayerOrPlayer () const
 
bool IsCharmed () const
 
bool isPossessed () const
 
bool isPossessedByPlayer () const
 
bool isPossessing () const
 
bool isPossessing (Unit *u) const
 
void SetCharm (Unit *target, bool apply)
 
bool SetCharmedBy (Unit *charmer, CharmType type, AuraApplication const *aurApp=nullptr)
 
void UpdateCharmAI ()
 
void RemoveCharmedBy (Unit *charmer)
 
void RemoveCharmAuras ()
 
void RemoveAllControlled (bool onDeath=false)
 
void DeleteCharmInfo ()
 
virtual bool HasSpellCooldown (uint32) const
 
virtual bool HasSpellItemCooldown (uint32, uint32) const
 
virtual void AddSpellCooldown (uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, PacketCooldowns const &cooldowns)
 
AuraAddAura (uint32 spellId, Unit *target)
 
AuraAddAura (SpellInfo const *spellInfo, uint8 effMask, Unit *target)
 
void SetAuraStack (uint32 spellId, Unit *target, uint32 stack)
 
Aura_TryStackingOrRefreshingExistingAura (SpellInfo const *newAura, uint8 effMask, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool periodicReset=false)
 
void _AddAura (UnitAura *aura, Unit *caster)
 
AuraApplication_CreateAuraApplication (Aura *aura, uint8 effMask)
 
void _ApplyAuraEffect (Aura *aura, uint8 effIndex)
 
void _ApplyAura (AuraApplication *aurApp, uint8 effMask)
 
void _UnapplyAura (AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
 
void _UnapplyAura (AuraApplication *aurApp, AuraRemoveMode removeMode)
 
void _RemoveNoStackAuraApplicationsDueToAura (Aura *aura)
 
void _RemoveNoStackAurasDueToAura (Aura *aura)
 
bool _IsNoStackAuraDueToAura (Aura *appliedAura, Aura *existingAura) const
 
void _RegisterAuraEffect (AuraEffect *aurEff, bool apply)
 
AuraMapGetOwnedAuras ()
 
AuraMap const & GetOwnedAuras () const
 
void RemoveOwnedAura (AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (Aura *aura, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
AuraGetOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
 
AuraApplicationMapGetAppliedAuras ()
 
AuraApplicationMap const & GetAppliedAuras () const
 
void RemoveAura (AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (AuraApplication *aurApp, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (Aura *aur, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveBindSightAuras ()
 
void RemoveAppliedAuras (std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (std::function< bool(Aura const *)> const &check)
 
void RemoveAppliedAuras (uint32 spellId, std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (uint32 spellId, std::function< bool(Aura const *)> const &check)
 
void RemoveAurasDueToSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAuraFromStack (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAurasDueToSpellByDispel (uint32 spellId, uint32 dispellerSpellId, ObjectGuid casterGUID, Unit *dispeller, uint8 chargesRemoved=1)
 
void RemoveAurasDueToSpellBySteal (uint32 spellId, ObjectGuid casterGUID, Unit *stealer)
 
void RemoveAurasDueToItemSpell (uint32 spellId, ObjectGuid castItemGuid)
 
void RemoveAurasByType (AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
 
void RemoveNotOwnSingleTargetAuras ()
 
void RemoveAurasWithInterruptFlags (uint32 flag, uint32 except=0, bool isAutoshot=false)
 
void RemoveAurasWithAttribute (uint32 flags)
 
void RemoveAurasWithFamily (SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID)
 
void RemoveAurasWithMechanic (uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
 
void RemoveMovementImpairingAuras (bool withRoot)
 
void RemoveAurasByShapeShift ()
 
void RemoveAreaAurasDueToLeaveWorld ()
 
void RemoveAllAuras ()
 
void RemoveArenaAuras ()
 
void RemoveAllAurasOnDeath ()
 
void RemoveAllAurasRequiringDeadTarget ()
 
void RemoveAllAurasExceptType (AuraType type)
 
void RemoveEvadeAuras ()
 
void DelayOwnedAuras (uint32 spellId, ObjectGuid caster, int32 delaytime)
 
void _RemoveAllAuraStatMods ()
 
void _ApplyAllAuraStatMods ()
 
AuraEffectList const & GetAuraEffectsByType (AuraType type) const
 
AuraListGetSingleCastAuras ()
 
AuraList const & GetSingleCastAuras () const
 
AuraEffectGetAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectOfRankedSpell (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectDummy (uint32 spellid) const
 
AuraEffectGetDummyAuraEffect (SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraApplicationGetAuraApplication (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
AuraApplicationGetAuraApplicationOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAuraOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
void GetDispellableAuraList (Unit *caster, uint32 dispelMask, DispelChargesList &dispelList, SpellInfo const *dispelSpell)
 
bool HasAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
 
uint32 GetAuraCount (uint32 spellId) const
 
bool HasAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
bool HasAuraType (AuraType auraType) const
 
bool HasAuraTypeWithCaster (AuraType auratype, ObjectGuid caster) const
 
bool HasAuraTypeWithMiscvalue (AuraType auratype, int32 miscvalue) const
 
bool HasAuraTypeWithAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
bool HasAuraTypeWithValue (AuraType auratype, int32 value) const
 
bool HasAuraTypeWithTriggerSpell (AuraType auratype, uint32 triggerSpell) const
 
bool HasNegativeAuraWithInterruptFlag (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasVisibleAuraType (AuraType auraType) const
 
bool HasNegativeAuraWithAttribute (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasAuraWithMechanic (uint32 mechanicMask) const
 
bool HasAuraTypeWithFamilyFlags (AuraType auraType, uint32 familyName, uint32 familyFlags) const
 
bool HasBreakableByDamageAuraType (AuraType type, uint32 excludeAura=0) const
 
bool HasBreakableByDamageCrowdControlAura (Unit *excludeCasterChannel=nullptr) const
 
AuraEffectIsScriptOverriden (SpellInfo const *spell, int32 script) const
 
uint32 GetDiseasesByCaster (ObjectGuid casterGUID, uint8 mode=0)
 
uint32 GetDoTsByCaster (ObjectGuid casterGUID) const
 
int32 GetTotalAuraModifierAreaExclusive (AuraType auratype) const
 
int32 GetTotalAuraModifier (AuraType auratype) const
 
float GetTotalAuraMultiplier (AuraType auratype) const
 
int32 GetMaxPositiveAuraModifier (AuraType auratype)
 
int32 GetMaxNegativeAuraModifier (AuraType auratype) const
 
int32 GetTotalAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
float GetTotalAuraMultiplierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetMaxPositiveAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
 
int32 GetMaxNegativeAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetTotalAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
float GetTotalAuraMultiplierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxPositiveAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxNegativeAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetTotalAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
float GetTotalAuraMultiplierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxPositiveAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxNegativeAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
VisibleAuraMap const * GetVisibleAuras ()
 
AuraApplicationGetVisibleAura (uint8 slot)
 
void SetVisibleAura (uint8 slot, AuraApplication *aur)
 
void RemoveVisibleAura (uint8 slot)
 
void ModifyAuraState (AuraStateType flag, bool apply)
 
uint32 BuildAuraStateUpdateForTarget (Unit *target) const
 
bool HasAuraState (AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
 
bool CanProc ()
 
void SetCantProc (bool apply)
 
void ProcDamageAndSpellFor (bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
void GetProcAurasTriggeredOnEvent (std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
 
void TriggerAurasProcOnEvent (CalcDamageInfo &damageInfo)
 
void TriggerAurasProcOnEvent (std::list< AuraApplication * > *myProcAuras, std::list< AuraApplication * > *targetProcAuras, Unit *actionTarget, uint32 typeMaskActor, uint32 typeMaskActionTarget, uint32 spellTypeMask, uint32 spellPhaseMask, uint32 hitMask, Spell *spell, DamageInfo *damageInfo, HealInfo *healInfo)
 
void TriggerAurasProcOnEvent (ProcEventInfo &eventInfo, std::list< AuraApplication * > &procAuras)
 
float GetWeaponProcChance () const
 
float GetPPMProcChance (uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
 
PlayerGetSpellModOwner () const
 
SpellGetCurrentSpell (CurrentSpellTypes spellType) const
 
SpellGetCurrentSpell (uint32 spellType) const
 
SpellFindCurrentSpellBySpellId (uint32 spell_id) const
 
int32 GetCurrentSpellCastTime (uint32 spell_id) const
 
virtual bool HasSpell (uint32) const
 
void SetCurrentCastedSpell (Spell *pSpell)
 
virtual void ProhibitSpellSchool (SpellSchoolMask, uint32)
 
void SetInstantCast (bool set)
 
bool CanInstantCast () const
 
bool IsNonMeleeSpellCast (bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
 
void InterruptNonMeleeSpells (bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
 
float GetSpellMaxRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
float GetSpellMinRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
uint32 GetInterruptMask () const
 
void AddInterruptMask (uint32 mask)
 
void UpdateInterruptMask ()
 
void InterruptSpell (CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
 
bool isSpellBlocked (Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
 
void FinishSpell (CurrentSpellTypes spellType, bool ok=true)
 
UnitGetMagicHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo)
 
UnitGetMeleeHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo=nullptr)
 
float MeleeSpellMissChance (Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
 
SpellMissInfo MeleeSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo MagicSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo SpellHitResult (Unit *victim, SpellInfo const *spell, bool canReflect=false)
 
SpellMissInfo SpellHitResult (Unit *victim, Spell const *spell, bool canReflect=false)
 
void SendHealSpellLog (HealInfo const &healInfo, bool critical=false)
 
int32 HealBySpell (HealInfo &healInfo, bool critical=false)
 
int32 SpellBaseHealingBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseHealingBonusTaken (SpellSchoolMask schoolMask)
 
float SpellPctHealingModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellHealingBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellHealingBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack=1)
 
void SendEnergizeSpellLog (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void EnergizeBySpell (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void ApplySpellImmune (uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
 
void ApplySpellDispelImmunity (SpellInfo const *spellProto, DispelType type, bool apply)
 
virtual bool IsImmunedToSpell (SpellInfo const *spellInfo, Spell const *spell=nullptr)
 
bool IsImmunedToDamage (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamage (SpellInfo const *spellInfo) const
 
bool IsImmunedToDamage (Spell const *spell) const
 
bool IsImmunedToSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToSchool (SpellInfo const *spellInfo) const
 
bool IsImmunedToSchool (Spell const *spell) const
 
bool IsImmunedToDamageOrSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamageOrSchool (SpellInfo const *spellInfo) const
 
virtual bool IsImmunedToSpellEffect (SpellInfo const *spellInfo, uint32 index) const
 
bool isBlockCritical ()
 
float SpellDoneCritChance (Unit const *, SpellInfo const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType, bool skipEffectCheck) const
 
float SpellTakenCritChance (Unit const *caster, SpellInfo const *spellProto, SpellSchoolMask schoolMask, float doneChance, WeaponAttackType attackType, bool skipEffectCheck) const
 
float ApplyEffectModifiers (SpellInfo const *spellProto, uint8 effect_index, float value) const
 
int32 CalcSpellDuration (SpellInfo const *spellProto)
 
int32 ModSpellDuration (SpellInfo const *spellProto, Unit const *target, int32 duration, bool positive, uint32 effectMask)
 
void ModSpellCastTime (SpellInfo const *spellProto, int32 &castTime, Spell *spell=nullptr)
 
float CalculateLevelPenalty (SpellInfo const *spellProto) const
 
uint32 GetCastingTimeForBonus (SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
 
void CastDelayedSpellWithPeriodicAmount (Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
 
SpellCastResult CastSpell (SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (float x, float y, float z, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (GameObject *go, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, CustomSpellValues const &value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
void _RegisterDynObject (DynamicObject *dynObj)
 
void _UnregisterDynObject (DynamicObject *dynObj)
 
DynamicObjectGetDynObject (uint32 spellId)
 
bool RemoveDynObject (uint32 spellId)
 
void RemoveAllDynObjects ()
 
GameObjectGetGameObject (uint32 spellId) const
 
void AddGameObject (GameObject *gameObj)
 
void RemoveGameObject (GameObject *gameObj, bool del)
 
void RemoveGameObject (uint32 spellid, bool del)
 
void RemoveAllGameObjects ()
 
bool IsPolymorphed () const
 
bool isFrozen () const
 
bool IsInFlight () const
 
bool IsLevitating () const
 
bool IsWalking () const
 
bool isMoving () const
 
bool isTurning () const
 
bool IsHovering () const
 
bool isSwimming () const
 
virtual bool CanFly () const =0
 
bool IsFlying () const
 
bool IsFalling () const
 
float GetHoverHeight () const
 
virtual bool IsMovementPreventedByCasting () const
 
virtual bool CanEnterWater () const =0
 
virtual bool CanSwim () const
 this method checks the current flag of a unit More...
 
bool CanFreeMove () const
 
void KnockbackFrom (float x, float y, float speedXY, float speedZ)
 
void JumpTo (float speedXY, float speedZ, bool forward=true)
 
void JumpTo (WorldObject *obj, float speedZ)
 
void UpdateSpeed (UnitMoveType mtype, bool forced)
 
float GetSpeed (UnitMoveType mtype) const
 
float GetSpeedRate (UnitMoveType mtype) const
 
void SetSpeed (UnitMoveType mtype, float rate, bool forced=false)
 
void SetSpeedRate (UnitMoveType mtype, float rate)
 
void propagateSpeedChange ()
 
void SendMonsterMove (float NewPosX, float NewPosY, float NewPosZ, uint32 TransitTime, SplineFlags sf=SPLINEFLAG_WALK_MODE)
 
void MonsterMoveWithSpeed (float x, float y, float z, float speed)
 
virtual bool SetWalk (bool enable)
 
virtual bool SetDisableGravity (bool disable, bool packetOnly=false, bool updateAnimationTier=true)
 
virtual bool SetSwim (bool enable)
 
virtual bool SetCanFly (bool enable, bool packetOnly=false)
 Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity(). More...
 
virtual bool SetWaterWalking (bool enable, bool packetOnly=false)
 Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players. More...
 
virtual bool SetFeatherFall (bool enable, bool packetOnly=false)
 
virtual bool SetHover (bool enable, bool packetOnly=false, bool updateAnimationTier=true)
 
MotionMasterGetMotionMaster ()
 
const MotionMasterGetMotionMaster () const
 
virtual MovementGeneratorType GetDefaultMovementType () const
 -------—End of Pet responses methods-------— More...
 
bool IsStopped () const
 
void StopMoving ()
 
void StopMovingOnCurrentPos ()
 
virtual void PauseMovement (uint32 timer=0, uint8 slot=0)
 Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline. More...
 
void ResumeMovement (uint32 timer=0, uint8 slot=0)
 
void SetControlled (bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
 
void DisableRotate (bool apply)
 
void DisableSpline ()
 
SheathState GetSheath () const
 
virtual void SetSheath (SheathState sheathed)
 
uint8 getStandState () const
 
bool IsSitState () const
 
bool IsStandState () const
 
void SetStandState (uint8 state)
 
void SetStandFlags (uint8 flags)
 
void RemoveStandFlags (uint8 flags)
 
DeathState getDeathState ()
 
virtual void setDeathState (DeathState s, bool despawn=false)
 
bool IsAlive () const
 
bool isDying () const
 
bool isDead () const
 
bool HasGhostAura () const
 
bool HasMountedAura () const
 
bool HasWaterWalkAura () const
 
bool HasFeatherFallAura () const
 
bool HasHoverAura () const
 
bool HasFlyAura () const
 
bool HasSpiritOfRedemptionAura () const
 
bool HasPreventsFleeingAura () const
 
bool HasPreventDurabilityLossAura () const
 
bool HasPreventResurectionAura () const
 
bool HasTransformAura () const
 
bool HasInterruptRegenAura () const
 
bool HasNoPVPCreditAura () const
 
bool HasWaterBreathingAura () const
 
bool HasIgnoreHitDirectionAura () const
 
bool HasSpellMagnetAura () const
 
bool HasOpenStableAura () const
 
bool HasCloneCasterAura () const
 
bool HasReflectSpellsAura () const
 
bool HasDetectAmoreAura () const
 
bool HasAllowOnlyAbilityAura () const
 
bool HasPeriodicDummyAura () const
 
bool HasControlVehicleAura () const
 
bool HasAOECharmAura () const
 
bool HasDetectSpellsAura () const
 
bool HasPacifySilenceAura () const
 
bool HasSilenceAura () const
 
bool HasShapeshiftAura () const
 
bool HasDecreaseSpeedAura () const
 
bool HasPacifyAura () const
 
bool HasIgnoreTargetResistAura () const
 
bool HasIncreaseMountedSpeedAura () const
 
bool HasIncreaseMountedFlightSpeedAura () const
 
bool HasThreatAura () const
 
bool HasAttackerSpellCritChanceAura () const
 
bool HasUnattackableAura () const
 
bool HasHealthRegenInCombatAura () const
 
bool HasRegenDuringCombatAura () const
 
bool HasFearAura () const
 
bool HasConfuseAura () const
 
bool HasRootAura () const
 
bool HasStunAura () const
 
bool HasTauntAura () const
 
bool HasStealthAura () const
 
bool HasStealthDetectAura () const
 
bool HasInvisibilityAura () const
 
bool HasInvisibilityDetectAura () const
 
bool IsHostileTo (Unit const *unit) const
 
bool IsHostileToPlayers () const
 
bool IsFriendlyTo (Unit const *unit) const
 
bool IsNeutralToAll () const
 
void ClearAllReactives ()
 
void StartReactiveTimer (ReactiveType reactive)
 
void UpdateReactives (uint32 p_time)
 
DiminishingLevels GetDiminishing (DiminishingGroup group)
 
void IncrDiminishing (DiminishingGroup group)
 
float ApplyDiminishingToDuration (DiminishingGroup group, int32 &duration, Unit *caster, DiminishingLevels Level, int32 limitduration)
 
void ApplyDiminishingAura (DiminishingGroup group, bool apply)
 
void ClearDiminishings ()
 
bool IsInPartyWith (Unit const *unit) const
 
bool IsInRaidWith (Unit const *unit) const
 
void GetPartyMembers (std::list< Unit * > &units)
 
UnitGetNextRandomRaidMemberOrPet (float radius)
 
void UpdateAuraForGroup (uint8 slot)
 
ReputationRank GetReactionTo (Unit const *target, bool checkOriginalFaction=false) const
 
ReputationRank GetFactionReactionTo (FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
 
SharedVisionList const & GetSharedVisionList ()
 
void AddPlayerToVision (Player *player)
 
void RemovePlayerFromVision (Player *player)
 
bool HasSharedVision () const
 
uint32 GetVirtualItemId (uint32 slot) const
 
void SetVirtualItem (uint32 slot, uint32 itemId)
 
bool IsMounted () const
 
uint32 GetMountID () const
 
void Mount (uint32 mount, uint32 vehicleId=0, uint32 creatureEntry=0)
 
void Dismount ()
 
bool IsInDisallowedMountForm () const
 
void addFollower (FollowerReference *pRef)
 
void removeFollower (FollowerReference *)
 
virtual float GetFollowAngle () const
 
GuardianGetGuardianPet () const
 
MinionGetFirstMinion () const
 
CreatureGetCompanionPet () const
 
PetCreateTamedPetFrom (Creature *creatureTarget, uint32 spell_id=0)
 
PetCreateTamedPetFrom (uint32 creatureEntry, uint32 spell_id=0)
 
bool InitTamedPet (Pet *pet, uint8 level, uint32 spell_id)
 
void SetMinion (Minion *minion, bool apply)
 
void GetAllMinionsByEntry (std::list< Creature * > &Minions, uint32 entry)
 
void RemoveAllMinionsByEntry (uint32 entry)
 
void AddPetAura (PetAura const *petSpell)
 
void RemovePetAura (PetAura const *petSpell)
 
void CastPetAura (PetAura const *aura)
 
bool IsPetAura (Aura const *aura)
 
void PetSpellFail (SpellInfo const *spellInfo, Unit *target, uint32 result)
 
void UnsummonAllTotems (bool onDeath=false)
 
TransportBaseGetDirectTransport () const
 
bool CreateVehicleKit (uint32 id, uint32 creatureEntry)
 Returns the transport this unit is on directly (if on vehicle and transport, return vehicle) More...
 
void RemoveVehicleKit ()
 
VehicleGetVehicleKit () const
 
VehicleGetVehicle () const
 
bool IsOnVehicle (Unit const *vehicle) const
 
UnitGetVehicleBase () const
 
CreatureGetVehicleCreatureBase () const
 
void EnterVehicle (Unit *base, int8 seatId=-1)
 
void EnterVehicleUnattackable (Unit *base, int8 seatId=-1)
 
void ExitVehicle (Position const *exitPosition=nullptr)
 
void ChangeSeat (int8 seatId, bool next=true)
 
bool HandleSpellClick (Unit *clicker, int8 seatId=-1)
 
void _ExitVehicle (Position const *exitPosition=nullptr)
 
void _EnterVehicle (Vehicle *vehicle, int8 seatId, AuraApplication const *aurApp=nullptr)
 
void HandleEmoteCommand (uint32 emoteId)
 
virtual void Talk (std::string_view text, ChatMsg msgType, Language language, float textRange, WorldObject const *target)
 
virtual void Say (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void Yell (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void TextEmote (std::string_view text, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (std::string_view text, Language language, Player *target, bool isBossWhisper=false)
 
virtual void Talk (uint32 textId, ChatMsg msgType, float textRange, WorldObject const *target)
 
virtual void Say (uint32 textId, WorldObject const *target=nullptr)
 
virtual void Yell (uint32 textId, WorldObject const *target=nullptr)
 
virtual void TextEmote (uint32 textId, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (uint32 textId, Player *target, bool isBossWhisper=false)
 
ShapeshiftForm GetShapeshiftForm () const
 
void SetShapeshiftForm (ShapeshiftForm form)
 
bool IsAttackSpeedOverridenShapeShift () const
 
bool IsInFeralForm () const
 
void setTransForm (uint32 spellid)
 
uint32 getTransForm () const
 
void DeMorph ()
 
virtual float GetNativeObjectScale () const
 
virtual void RecalculateObjectScale ()
 
uint32 GetDisplayId () const
 
virtual void SetDisplayId (uint32 modelId, float displayScale=1.f)
 
uint32 GetNativeDisplayId () const
 
void RestoreDisplayId ()
 
void SetNativeDisplayId (uint32 displayId)
 
uint32 GetModelForForm (ShapeshiftForm form, uint32 spellId) const
 
uint32 GetModelForTotem (PlayerTotemType totemType)
 
virtual bool IsInWater () const
 
virtual bool IsUnderWater () const
 
void NearTeleportTo (Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void NearTeleportTo (float x, float y, float z, float orientation, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void SetInFront (WorldObject const *target)
 
void SetFacingTo (float ori)
 
void SetFacingToObject (WorldObject *object)
 
bool isInAccessiblePlaceFor (Creature const *c) const
 
bool isInFrontInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool isInBackInMap (Unit const *target, float distance, float arc=M_PI) const
 
float GetCollisionHeight () const override
 Return collision height sent to client. More...
 
float GetCollisionWidth () const override
 this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC More...
 
float GetCollisionRadius () const override
 this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC More...
 
void UpdateOrientation (float orientation)
 Only server-side orientation update, does not broadcast to client. More...
 
void UpdateHeight (float newZ)
 Only server-side height update, does not broadcast to client. More...
 
virtual bool UpdatePosition (float x, float y, float z, float ang, bool teleport=false)
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void ProcessPositionDataChanged (PositionFullTerrainStatus const &data) override
 
virtual void ProcessTerrainStatusUpdate ()
 
bool IsVisible () const
 
void SetVisible (bool x)
 
void SetModelVisible (bool on)
 
uint32 GetPhaseByAuras () const
 
void SetPhaseMask (uint32 newPhaseMask, bool update) override
 
void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false) override
 
void AddPointedBy (SafeUnitPointer *sup)
 
void RemovePointedBy (SafeUnitPointer *sup)
 
void SendAttackStateUpdate (CalcDamageInfo *damageInfo)
 
void SendAttackStateUpdate (uint32 HitInfo, Unit *target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount)
 
void SendComboPoints ()
 
void SendPlaySpellVisual (uint32 id)
 
void SendPlaySpellImpact (ObjectGuid guid, uint32 id)
 
void SendPetActionFeedback (uint8 msg)
 -------—Pet responses methods--------------— More...
 
void SendPetTalk (uint32 pettalk)
 
void SendPetAIReaction (ObjectGuid guid)
 
void SendPeriodicAuraLog (SpellPeriodicAuraLogInfo *pInfo)
 
void SendSpellNonMeleeDamageLog (SpellNonMeleeDamage *log)
 
void SendSpellNonMeleeReflectLog (SpellNonMeleeDamage *log, Unit *attacker)
 
void SendSpellNonMeleeDamageLog (Unit *target, SpellInfo const *spellInfo, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit=false, bool Split=false)
 
void SendSpellMiss (Unit *target, uint32 spellID, SpellMissInfo missInfo)
 
void SendSpellDamageResist (Unit *target, uint32 spellId)
 
void SendSpellDamageImmune (Unit *target, uint32 spellId)
 
void SendTameFailure (uint8 result)
 
void SendTeleportPacket (Position &pos)
 
void SendMovementFlagUpdate (bool self=false)
 
void SendMovementWaterWalking (Player *sendTo)
 
void SendMovementFeatherFall (Player *sendTo)
 
void SendMovementHover (Player *sendTo)
 
void SendChangeCurrentVictimOpcode (HostileReference *pHostileReference)
 
void SendClearThreatListOpcode ()
 
void SendRemoveFromThreatListOpcode (HostileReference *pHostileReference)
 
void SendThreatListUpdate ()
 
void SendClearTarget ()
 
void ExecuteDelayedUnitRelocationEvent ()
 
void ExecuteDelayedUnitAINotifyEvent ()
 
void BuildHeartBeatMsg (WorldPacket *data) const
 
void BuildMovementPacket (ByteBuffer *data) const
 
void OutDebugInfo () const
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from WorldObject
 ~WorldObject () override
 
virtual void Update (uint32)
 
void _Create (ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void GetNearPoint2D (WorldObject const *searcher, float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint2D (float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint (WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
 
void GetVoidClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0, float controlZ=0) const
 
bool GetClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float angle=0, WorldObject const *forWho=nullptr, bool force=false) const
 
void MovePosition (Position &pos, float dist, float angle, bool disableWarning=false)
 
Position GetNearPosition (float dist, float angle, bool disableWarning=false)
 
void MovePositionToFirstCollision (Position &pos, float dist, float angle)
 
Position GetFirstCollisionPosition (float startX, float startY, float startZ, float destX, float destY)
 
Position GetFirstCollisionPosition (float destX, float destY, float destZ)
 
Position GetFirstCollisionPosition (float dist, float angle)
 
Position GetRandomNearPosition (float radius, bool disableWarning=false)
 
void GetContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
void GetChargeContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
float GetObjectSize () const
 
virtual float GetCombatReach () const
 
void UpdateGroundPositionZ (float x, float y, float &z) const
 
void UpdateAllowedPositionZ (float x, float y, float &z, float *groundZ=nullptr) const
 
void GetRandomPoint (const Position &srcPos, float distance, float &rand_x, float &rand_y, float &rand_z) const
 
Position GetRandomPoint (const Position &srcPos, float distance) const
 
uint32 GetInstanceId () const
 
virtual void SetPhaseMask (uint32 newPhaseMask, bool update)
 
uint32 GetPhaseMask () const
 
bool InSamePhase (WorldObject const *obj) const
 
bool InSamePhase (uint32 phasemask) const
 
uint32 GetZoneId () const
 
uint32 GetAreaId () const
 
void GetZoneAndAreaId (uint32 &zoneid, uint32 &areaid) const
 
bool IsOutdoors () const
 
LiquidData const & GetLiquidData () const
 
InstanceScriptGetInstanceScript () const
 
std::string const & GetName () const
 
void SetName (std::string const &newname)
 
virtual std::string const & GetNameForLocaleIdx (LocaleConstant) const
 
float GetDistance (WorldObject const *obj) const
 
float GetDistance (const Position &pos) const
 
float GetDistance (float x, float y, float z) const
 
float GetDistance2d (WorldObject const *obj) const
 
float GetDistance2d (float x, float y) const
 
float GetDistanceZ (WorldObject const *obj) const
 
bool IsSelfOrInSameMap (WorldObject const *obj) const
 
bool IsInMap (WorldObject const *obj) const
 
bool IsWithinDist3d (float x, float y, float z, float dist) const
 
bool IsWithinDist3d (const Position *pos, float dist) const
 
bool IsWithinDist2d (float x, float y, float dist) const
 
bool IsWithinDist2d (const Position *pos, float dist) const
 
bool IsWithinDist (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinDistInMap (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinLOS (float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
 
bool IsWithinLOSInMap (WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
Position GetHitSpherePointFor (Position const &dest, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
void GetHitSpherePointFor (Position const &dest, float &x, float &y, float &z, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
bool GetDistanceOrder (WorldObject const *obj1, WorldObject const *obj2, bool is3D=true) const
 
bool IsInRange (WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
 
bool IsInRange2d (float x, float y, float minRange, float maxRange) const
 
bool IsInRange3d (float x, float y, float z, float minRange, float maxRange) const
 
bool isInFront (WorldObject const *target, float arc=M_PI) const
 
bool isInBack (WorldObject const *target, float arc=M_PI) const
 
bool IsInBetween (WorldObject const *obj1, WorldObject const *obj2, float size=0) const
 
virtual void CleanupsBeforeDelete (bool finalCleanup=true)
 
virtual void SendMessageToSet (WorldPacket const *data, bool self) const
 
virtual void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self) const
 
virtual void SendMessageToSet (WorldPacket const *data, Player const *skipped_rcvr) const
 
virtual uint8 getLevelForTarget (WorldObject const *) const
 
void PlayDistanceSound (uint32 sound_id, Player *target=nullptr)
 
void PlayDirectSound (uint32 sound_id, Player *target=nullptr)
 
void PlayRadiusSound (uint32 sound_id, float radius)
 
void PlayDirectMusic (uint32 music_id, Player *target=nullptr)
 
void PlayRadiusMusic (uint32 music_id, float radius)
 
void SendObjectDeSpawnAnim (ObjectGuid guid)
 
virtual void SaveRespawnTime ()
 
void AddObjectToRemoveList ()
 
float GetGridActivationRange () const
 
float GetVisibilityRange () const
 
virtual float GetSightRange (WorldObject const *target=nullptr) const
 
bool CanSeeOrDetect (WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
 
void SendPlayMusic (uint32 Music, bool OnlySelf)
 
virtual void SetMap (Map *map)
 
virtual void ResetMap ()
 
MapGetMap () const
 
MapFindMap () const
 
void SetZoneScript ()
 
void ClearZoneScript ()
 
ZoneScriptGetZoneScript () const
 
TempSummonSummonCreature (uint32 id, const Position &pos, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false) const
 
TempSummonSummonCreature (uint32 id, float x, float y, float z, float ang=0, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false)
 
GameObjectSummonGameObject (uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport=true, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
 
CreatureSummonTrigger (float x, float y, float z, float ang, uint32 dur, bool setLevel=false, CreatureAI *(*GetAI)(Creature *)=nullptr)
 
void SummonCreatureGroup (uint8 group, std::list< TempSummon * > *list=nullptr)
 
CreatureFindNearestCreature (uint32 entry, float range, bool alive=true) const
 
GameObjectFindNearestGameObject (uint32 entry, float range, bool onlySpawned=false) const
 
GameObjectFindNearestGameObjectOfType (GameobjectTypes type, float range) const
 
PlayerSelectNearestPlayer (float distance=0) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetDeadCreatureListInGrid (std::list< Creature * > &lList, float maxSearchRange, bool alive=false) const
 
void DestroyForNearbyPlayers ()
 
virtual void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false)
 
void BuildUpdate (UpdateDataMapType &data_map, UpdatePlayerSet &player_set) override
 
void GetCreaturesWithEntryInRange (std::list< Creature * > &creatureList, float radius, uint32 entry)
 
void SetPositionDataUpdate ()
 
void UpdatePositionData ()
 
void AddToObjectUpdate () override
 
void RemoveFromObjectUpdate () override
 
void AddToNotify (uint16 f)
 
void RemoveFromNotify (uint16 f)
 
bool isNeedNotify (uint16 f) const
 
uint16 GetNotifyFlags () const
 
bool NotifyExecuted (uint16 f) const
 
void SetNotified (uint16 f)
 
void ResetAllNotifies ()
 
bool isActiveObject () const
 
void setActive (bool isActiveObject)
 
bool IsFarVisible () const
 
bool IsVisibilityOverridden () const
 
void SetVisibilityDistanceOverride (VisibilityDistanceType type)
 
void SetWorldObject (bool apply)
 
bool IsPermanentWorldObject () const
 
bool IsWorldObject () const
 
bool IsInWintergrasp () const
 
TransportGetTransport () const
 
float GetTransOffsetX () const
 
float GetTransOffsetY () const
 
float GetTransOffsetZ () const
 
float GetTransOffsetO () const
 
uint32 GetTransTime () const
 
int8 GetTransSeat () const
 
virtual ObjectGuid GetTransGUID () const
 
void SetTransport (Transport *t)
 
virtual float GetStationaryX () const
 
virtual float GetStationaryY () const
 
virtual float GetStationaryZ () const
 
virtual float GetStationaryO () const
 
float GetMapWaterOrGroundLevel (float x, float y, float z, float *ground=nullptr) const
 
float GetMapHeight (float x, float y, float z, bool vmap=true, float distanceToSearch=50.0f) const
 
float GetFloorZ () const
 
float GetMinHeightInWater () const
 Get the minimum height of a object that should be in water to start floating/swim. More...
 
virtual float GetCollisionHeight () const
 
virtual float GetCollisionWidth () const
 
virtual float GetCollisionRadius () const
 
void AddAllowedLooter (ObjectGuid guid)
 
void ResetAllowedLooters ()
 
void SetAllowedLooters (GuidUnorderedSet const looters)
 
bool HasAllowedLooter (ObjectGuid guid) const
 
GuidUnorderedSet const & GetAllowedLooters () const
 
void RemoveAllowedLooter (ObjectGuid guid)
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from Object
virtual ~Object ()
 
bool IsInWorld () const
 
virtual void AddToWorld ()
 
virtual void RemoveFromWorld ()
 
ObjectGuid GetGUID () const
 
PackedGuid const & GetPackGUID () const
 
uint32 GetEntry () const
 
void SetEntry (uint32 entry)
 
float GetObjectScale () const
 
virtual void SetObjectScale (float scale)
 
virtual uint32 GetDynamicFlags () const
 
bool HasDynamicFlag (uint32 flag) const
 
virtual void SetDynamicFlag (uint32 flag)
 
virtual void RemoveDynamicFlag (uint32 flag)
 
virtual void ReplaceAllDynamicFlags (uint32 flag)
 
TypeID GetTypeId () const
 
bool isType (uint16 mask) const
 
virtual void BuildCreateUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void SendUpdateToPlayer (Player *player)
 
void BuildValuesUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void BuildOutOfRangeUpdateBlock (UpdateData *data) const
 
void BuildMovementUpdateBlock (UpdateData *data, uint32 flags=0) const
 
virtual void DestroyForPlayer (Player *target, bool onDeath=false) const
 
int32 GetInt32Value (uint16 index) const
 
uint32 GetUInt32Value (uint16 index) const
 
uint64 GetUInt64Value (uint16 index) const
 
float GetFloatValue (uint16 index) const
 
uint8 GetByteValue (uint16 index, uint8 offset) const
 
uint16 GetUInt16Value (uint16 index, uint8 offset) const
 
ObjectGuid GetGuidValue (uint16 index) const
 
void SetInt32Value (uint16 index, int32 value)
 
void SetUInt32Value (uint16 index, uint32 value)
 
void UpdateUInt32Value (uint16 index, uint32 value)
 
void SetUInt64Value (uint16 index, uint64 value)
 
void SetFloatValue (uint16 index, float value)
 
void SetByteValue (uint16 index, uint8 offset, uint8 value)
 
void SetUInt16Value (uint16 index, uint8 offset, uint16 value)
 
void SetInt16Value (uint16 index, uint8 offset, int16 value)
 
void SetGuidValue (uint16 index, ObjectGuid value)
 
void SetStatFloatValue (uint16 index, float value)
 
void SetStatInt32Value (uint16 index, int32 value)
 
bool AddGuidValue (uint16 index, ObjectGuid value)
 
bool RemoveGuidValue (uint16 index, ObjectGuid value)
 
void ApplyModUInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModUInt64Value (uint16 index, int32 val, bool apply)
 
void ApplyModPositiveFloatValue (uint16 index, float val, bool apply)
 
void ApplyModSignedFloatValue (uint16 index, float val, bool apply)
 
void ApplyPercentModFloatValue (uint16 index, float val, bool apply)
 
void SetFlag (uint16 index, uint32 newFlag)
 
void RemoveFlag (uint16 index, uint32 oldFlag)
 
void ToggleFlag (uint16 index, uint32 flag)
 
bool HasFlag (uint16 index, uint32 flag) const
 
void ApplyModFlag (uint16 index, uint32 flag, bool apply)
 
void SetByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
void RemoveByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
bool HasByteFlag (uint16 index, uint8 offset, uint8 flag) const
 
void SetFlag64 (uint16 index, uint64 newFlag)
 
void RemoveFlag64 (uint16 index, uint64 oldFlag)
 
void ToggleFlag64 (uint16 index, uint64 flag)
 
bool HasFlag64 (uint16 index, uint64 flag) const
 
void ApplyModFlag64 (uint16 index, uint64 flag, bool apply)
 
void ClearUpdateMask (bool remove)
 
uint16 GetValuesCount () const
 
virtual bool hasQuest (uint32) const
 
virtual bool hasInvolvedQuest (uint32) const
 
virtual void BuildUpdate (UpdateDataMapType &, UpdatePlayerSet &)
 
void BuildFieldsUpdate (Player *, UpdateDataMapType &)
 
void SetFieldNotifyFlag (uint16 flag)
 
void RemoveFieldNotifyFlag (uint16 flag)
 
void ForceValuesUpdateAtIndex (uint32)
 
bool IsPlayer () const
 
PlayerToPlayer ()
 
Player const * ToPlayer () const
 
bool IsCreature () const
 
CreatureToCreature ()
 
Creature const * ToCreature () const
 
bool IsUnit () const
 
UnitToUnit ()
 
Unit const * ToUnit () const
 
bool IsGameObject () const
 
GameObjectToGameObject ()
 
GameObject const * ToGameObject () const
 
bool IsCorpse () const
 
CorpseToCorpse ()
 
Corpse const * ToCorpse () const
 
bool IsDynamicObject () const
 
DynamicObjectToDynObject ()
 
DynamicObject const * ToDynObject () const
 
bool IsItem () const
 
virtual std::string GetDebugInfo () const
 
- Public Member Functions inherited from WorldLocation
 WorldLocation (uint32 _mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
 WorldLocation (uint32 mapId, Position const &position)
 
void WorldRelocate (const WorldLocation &loc)
 
void WorldRelocate (uint32 mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
void SetMapId (uint32 mapId)
 
uint32 GetMapId () const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z, float &o) const
 
void GetWorldLocation (WorldLocation *location) const
 
WorldLocation GetWorldLocation () const
 
std::string GetDebugInfo () const
 
- Public Member Functions inherited from Position
 Position (float x=0, float y=0, float z=0, float o=0)
 
 Position (Position const &loc)
 
 Position (Position &&)=default
 
Positionoperator= (const Position &)=default
 
Positionoperator= (Position &&)=default
 
bool operator== (Position const &a) const
 
bool operator!= (Position const &a)
 
 operator G3D::Vector3 () const
 
void Relocate (float x, float y)
 
void Relocate (float x, float y, float z)
 
void Relocate (float x, float y, float z, float orientation)
 
void Relocate (const Position &pos)
 
void Relocate (const Position *pos)
 
void RelocatePolarOffset (float angle, float dist, float z=0.0f)
 
void RelocateOffset (const Position &offset)
 
void SetOrientation (float orientation)
 
float GetPositionX () const
 
float GetPositionY () const
 
float GetPositionZ () const
 
float GetOrientation () const
 
void GetPosition (float &x, float &y) const
 
void GetPosition (float &x, float &y, float &z) const
 
void GetPosition (float &x, float &y, float &z, float &o) const
 
Position GetPosition () const
 
Position::PositionXYZStreamer PositionXYZStream ()
 
Position::PositionXYZOStreamer PositionXYZOStream ()
 
bool IsPositionValid () const
 
float GetExactDist2dSq (const float x, const float y) const
 
float GetExactDist2dSq (Position const &pos) const
 
float GetExactDist2dSq (Position const *pos) const
 
float GetExactDist2d (const float x, const float y) const
 
float GetExactDist2d (Position const &pos) const
 
float GetExactDist2d (Position const *pos) const
 
float GetExactDistSq (float x, float y, float z) const
 
float GetExactDistSq (Position const &pos) const
 
float GetExactDistSq (Position const *pos) const
 
float GetExactDist (float x, float y, float z) const
 
float GetExactDist (Position const &pos) const
 
float GetExactDist (Position const *pos) const
 
void GetPositionOffsetTo (const Position &endPos, Position &retOffset) const
 
Position GetPositionWithOffset (Position const &offset) const
 
float GetAngle (const Position *pos) const
 
float GetAngle (float x, float y) const
 
float GetAbsoluteAngle (float x, float y) const
 
float GetAbsoluteAngle (Position const &pos) const
 
float GetAbsoluteAngle (Position const *pos) const
 
float GetRelativeAngle (const Position *pos) const
 
float GetRelativeAngle (float x, float y) const
 
float ToAbsoluteAngle (float relAngle) const
 
void GetSinCos (float x, float y, float &vsin, float &vcos) const
 
bool IsInDist2d (float x, float y, float dist) const
 
bool IsInDist2d (const Position *pos, float dist) const
 
bool IsInDist (float x, float y, float z, float dist) const
 
bool IsInDist (const Position *pos, float dist) const
 
bool IsWithinBox (const Position &center, float xradius, float yradius, float zradius) const
 
bool HasInArc (float arcangle, const Position *pos, float targetRadius=0.0f) const
 
bool HasInLine (Position const *pos, float width) const
 
std::string ToString () const
 

Static Public Member Functions

static void ApplyResilience (Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
 
static float GetEffectiveResistChance (Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
 
static uint32 DealDamage (Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
 
static void DealDamageMods (Unit const *victim, uint32 &damage, uint32 *absorb)
 
static void Kill (Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
static bool IsDamageReducedByArmor (SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
 
static uint32 CalcArmorReducedDamage (Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
 
static uint32 SpellCriticalDamageBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static void ProcDamageAndSpell (Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
static int32 DealHeal (Unit *healer, Unit *victim, uint32 addhealth)
 
static uint32 SpellCriticalHealingBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static void CalcAbsorbResist (DamageInfo &dmgInfo, bool Splited=false)
 
static void CalcHealAbsorb (HealInfo &healInfo)
 
static void HandleSafeUnitPointersOnDelete (Unit *thisUnit)
 
- Static Public Member Functions inherited from Object
static ObjectGuid GetGUID (Object const *o)
 
- Static Public Member Functions inherited from Position
static float NormalizeOrientation (float o)
 

Public Attributes

uint32 m_extraAttacks
 
bool m_canDualWield
 
ControlSet m_Controlled
 
SafeUnitPointer m_movedByPlayer
 
ObjectGuid m_SummonSlot [MAX_SUMMON_SLOT]
 
ObjectGuid m_ObjectSlot [MAX_GAMEOBJECT_SLOT]
 
float m_modMeleeHitChance
 
float m_modRangedHitChance
 
float m_modSpellHitChance
 
int32 m_baseSpellCritChance
 
float m_threatModifier [MAX_SPELL_SCHOOL]
 
float m_modAttackSpeedPct [3]
 
EventProcessor m_Events
 
SpellImmuneList m_spellImmune [MAX_SPELL_IMMUNITY]
 
uint32 m_lastSanctuaryTime
 
PetAuraSet m_petAuras
 
bool IsAIEnabled
 
bool NeedChangeAI
 
bool m_ControlledByPlayer
 
bool m_CreatedByPlayer
 
std::set< SafeUnitPointer * > SafeUnitPointerSet
 
Position m_last_notify_position
 
uint32 m_last_notify_mstime
 
uint16 m_delayed_unit_relocation_timer
 
uint16 m_delayed_unit_ai_notify_timer
 
bool bRequestForcedVisibilityUpdate
 
Movement::MoveSplinemovespline
 
- Public Attributes inherited from WorldObject
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealth
 
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealthDetect
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibility
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibilityDetect
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibility
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibilityDetect
 
uint32 LastUsedScriptID
 
MovementInfo m_movementInfo
 
ElunaEventProcessor * elunaEvents
 
- Public Attributes inherited from Object
DataMap CustomData
 
- Public Attributes inherited from WorldLocation
uint32 m_mapId
 
- Public Attributes inherited from Position
float m_positionX = 0
 
float m_positionY = 0
 
float m_positionZ = 0
 
float m_orientation = 0
 

Protected Types

typedef std::list< DynamicObject * > DynObjectList
 
typedef GuidList GameObjectList
 
typedef std::map< ObjectGuid, float > CharmThreatMap
 

Protected Member Functions

 Unit (bool isWorldObject)
 
void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target) override
 
void _UpdateSpells (uint32 time)
 
void _DeleteRemovedAuras ()
 
void _UpdateAutoRepeatSpell ()
 
bool IsAlwaysVisibleFor (WorldObject const *seer) const override
 
bool IsAlwaysDetectableFor (WorldObject const *seer) const override
 
void SetFeared (bool apply, Unit *fearedBy=nullptr, bool isFear=false)
 
void SetConfused (bool apply)
 
void SetStunned (bool apply)
 
void SetRooted (bool apply, bool isStun=false)
 
- Protected Member Functions inherited from WorldObject
 WorldObject (bool isWorldObject)
 
virtual void ProcessPositionDataChanged (PositionFullTerrainStatus const &data)
 
void SetLocationMapId (uint32 _mapId)
 
void SetLocationInstanceId (uint32 _instanceId)
 
virtual bool IsNeverVisible () const
 
virtual bool IsAlwaysVisibleFor (WorldObject const *) const
 
virtual bool IsInvisibleDueToDespawn () const
 
virtual bool IsAlwaysDetectableFor (WorldObject const *) const
 
- Protected Member Functions inherited from Object
 Object ()
 
void _InitValues ()
 
void _Create (ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
 
std::string _ConcatFields (uint16 startIndex, uint16 size) const
 
bool _LoadIntoDataField (std::string const &data, uint32 startOffset, uint32 count)
 
uint32 GetUpdateFieldData (Player const *target, uint32 *&flags) const
 
void BuildMovementUpdate (ByteBuffer *data, uint16 flags) const
 
virtual void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target)
 
virtual void AddToObjectUpdate ()=0
 
virtual void RemoveFromObjectUpdate ()=0
 
void AddToObjectUpdateIfNeeded ()
 

Protected Attributes

UnitAIi_AI
 
UnitAIi_disabledAI
 
uint8 m_realRace
 
uint8 m_race
 
bool m_AutoRepeatFirstCast
 
int32 m_attackTimer [MAX_ATTACK]
 
float m_createStats [MAX_STATS]
 
AttackerSet m_attackers
 
Unitm_attacking
 
DeathState m_deathState
 
int32 m_procDeep
 
DynObjectList m_dynObj
 
GameObjectList m_gameObj
 
uint32 m_transform
 
Spellm_currentSpells [CURRENT_MAX_SPELL]
 
AuraMap m_ownedAuras
 
AuraApplicationMap m_appliedAuras
 
AuraList m_removedAuras
 
AuraMap::iterator m_auraUpdateIterator
 
uint32 m_removedAurasCount
 
AuraEffectList m_modAuras [TOTAL_AURAS]
 
AuraList m_scAuras
 
AuraApplicationList m_interruptableAuras
 
AuraStateAurasMap m_auraStateAuras
 
uint32 m_interruptMask
 
float m_auraModifiersGroup [UNIT_MOD_END][MODIFIER_TYPE_END]
 
float m_weaponDamage [MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
 
bool m_canModifyStats
 
VisibleAuraMap m_visibleAuras
 
float m_speed_rate [MAX_MOVE_TYPE]
 
CharmInfom_charmInfo
 
SharedVisionList m_sharedVision
 
MotionMasteri_motionMaster
 
uint32 m_reactiveTimer [MAX_REACTIVE]
 
int32 m_regenTimer
 
ThreatMgr m_ThreatMgr
 
CharmThreatMap _charmThreatInfo
 
Vehiclem_vehicle
 
Vehiclem_vehicleKit
 
uint32 m_unitTypeMask
 
LiquidTypeEntry const * _lastLiquid
 
bool m_applyResilience
 
bool _instantCast
 
uint32 m_rootTimes
 
- Protected Attributes inherited from WorldObject
std::string m_name
 
bool m_isActive
 
bool m_isFarVisible
 
Optional< float > m_visibilityDistanceOverride
 
const bool m_isWorldObject
 
ZoneScriptm_zoneScript
 
uint32 _zoneId
 
uint32 _areaId
 
float _floorZ
 
bool _outdoors
 
LiquidData _liquidData
 
bool _updatePositionData
 
Transportm_transport
 
- Protected Attributes inherited from Object
uint16 m_objectType
 
TypeID m_objectTypeId
 
uint16 m_updateFlag
 
union {
   int32 *   m_int32Values
 
   uint32 *   m_uint32Values
 
   float *   m_floatValues
 
}; 
 
UpdateMask _changesMask
 
uint16 m_valuesCount
 
uint16 _fieldNotifyFlags
 
bool m_objectUpdated
 

Private Types

typedef std::unordered_map< uint64, BuildValuesCachedBufferValuesUpdateCache
 

Private Member Functions

bool IsTriggeredAtSpellProcEvent (Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
 
bool HandleDummyAuraProc (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
 
bool HandleAuraProc (Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
 
bool HandleProcTriggerSpell (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
 
bool HandleOverrideClassScriptAuraProc (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
 
bool HandleAuraRaidProcFromChargeWithValue (AuraEffect *triggeredByAura)
 
bool HandleAuraRaidProcFromCharge (AuraEffect *triggeredByAura)
 
void UpdateSplineMovement (uint32 t_diff)
 
void UpdateSplinePosition ()
 
float GetCombatRatingReduction (CombatRating cr) const
 
uint32 GetCombatRatingDamageReduction (CombatRating cr, float rate, float cap, uint32 damage) const
 
void PatchValuesUpdate (ByteBuffer &valuesUpdateBuf, BuildValuesCachePosPointers &posPointers, Player *target)
 
void InvalidateValuesUpdateCache ()
 
float processDummyAuras (float TakenTotalMod) const
 
void _addAttacker (Unit *pAttacker)
 
void _removeAttacker (Unit *pAttacker)
 

Private Attributes

uint32 m_state
 
uint32 m_CombatTimer
 
uint32 m_lastManaUse
 
Diminishing m_Diminishing
 
HostileRefMgr m_HostileRefMgr
 
FollowerRefMgr m_FollowingRefMgr
 
Unitm_comboTarget
 
int8 m_comboPoints
 
std::unordered_set< Unit * > m_ComboPointHolders
 
RedirectThreatInfo _redirectThreatInfo
 
bool m_cleanupDone
 
bool m_duringRemoveFromWorld
 
uint32 _oldFactionId
 faction before charm More...
 
bool _isWalkingBeforeCharm
 Are we walking before we were charmed? More...
 
uint32 _lastExtraAttackSpell
 
std::unordered_map< ObjectGuid, uint32extraAttacksTargets
 
ObjectGuid _lastDamagedTargetGuid
 
ValuesUpdateCache _valuesUpdateCache
 

Detailed Description

Member Typedef Documentation

◆ AttackerSet

typedef std::unordered_set<Unit*> Unit::AttackerSet

◆ AuraApplicationList

◆ AuraApplicationMap

◆ AuraApplicationMapBounds

typedef std::pair<AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator> Unit::AuraApplicationMapBounds

◆ AuraApplicationMapBoundsNonConst

typedef std::pair<AuraApplicationMap::iterator, AuraApplicationMap::iterator> Unit::AuraApplicationMapBoundsNonConst

◆ AuraEffectList

typedef std::list<AuraEffect*> Unit::AuraEffectList

◆ AuraList

typedef std::list<Aura*> Unit::AuraList

◆ AuraMap

typedef std::multimap<uint32, Aura*> Unit::AuraMap

◆ AuraMapBounds

typedef std::pair<AuraMap::const_iterator, AuraMap::const_iterator> Unit::AuraMapBounds

◆ AuraMapBoundsNonConst

typedef std::pair<AuraMap::iterator, AuraMap::iterator> Unit::AuraMapBoundsNonConst

◆ AuraStateAurasMap

◆ AuraStateAurasMapBounds

typedef std::pair<AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator> Unit::AuraStateAurasMapBounds

◆ CharmThreatMap

typedef std::map<ObjectGuid, float> Unit::CharmThreatMap
protected

◆ ComboPointHolderSet

◆ ControlSet

typedef std::set<Unit*> Unit::ControlSet

◆ Diminishing

◆ DynObjectList

typedef std::list<DynamicObject*> Unit::DynObjectList
protected

◆ GameObjectList

typedef GuidList Unit::GameObjectList
protected

◆ PetAuraSet

typedef std::set<PetAura const*> Unit::PetAuraSet

◆ ValuesUpdateCache

typedef std::unordered_map<uint64 , BuildValuesCachedBuffer> Unit::ValuesUpdateCache
private

◆ VisibleAuraMap

Constructor & Destructor Documentation

◆ ~Unit()

Unit::~Unit ( )
override
339{
340 // set current spells as deletable
341 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
342 if (m_currentSpells[i])
343 {
345 m_currentSpells[i] = nullptr;
346 }
347
349
350 delete i_motionMaster;
351 delete m_charmInfo;
352 delete movespline;
353
356 ASSERT(m_attackers.empty());
357
358 // pussywizard: clear m_sharedVision along with back references
359 if (!m_sharedVision.empty())
360 {
361 do
362 {
363 Player* p = *(m_sharedVision.begin());
364 p->m_isInSharedVisionOf.erase(this);
365 m_sharedVision.remove(p);
366 } while (!m_sharedVision.empty());
367 }
368
369 ASSERT(m_Controlled.empty());
370 ASSERT(m_appliedAuras.empty());
371 ASSERT(m_ownedAuras.empty());
372 ASSERT(m_removedAuras.empty());
373 ASSERT(m_gameObj.empty());
374 ASSERT(m_dynObj.empty());
375
376 if (m_movedByPlayer && m_movedByPlayer != this)
377 LOG_INFO("misc", "Unit::~Unit (A1)");
378
380}
#define ASSERT
Definition: Errors.h:68
#define LOG_INFO(filterType__,...)
Definition: Log.h:165
std::uint8_t uint8
Definition: Define.h:109
#define CURRENT_MAX_SPELL
Definition: Unit.h:544
Definition: Player.h:1064
std::set< Unit * > m_isInSharedVisionOf
Definition: Player.h:2318
bool m_duringRemoveFromWorld
Definition: Unit.h:2117
Spell * m_currentSpells[CURRENT_MAX_SPELL]
Definition: Unit.h:2029
AuraList m_removedAuras
Definition: Unit.h:2033
ControlSet m_Controlled
Definition: Unit.h:1940
Movement::MoveSpline * movespline
Definition: Unit.h:1982
CharmInfo * m_charmInfo
Definition: Unit.h:2050
MotionMaster * i_motionMaster
Definition: Unit.h:2053
void _DeleteRemovedAuras()
Definition: Unit.cpp:3835
DynObjectList m_dynObj
Definition: Unit.h:2023
SafeUnitPointer m_movedByPlayer
Definition: Unit.h:1942
AttackerSet m_attackers
Definition: Unit.h:2015
Unit * m_attacking
Definition: Unit.h:2016
GameObjectList m_gameObj
Definition: Unit.h:2026
AuraMap m_ownedAuras
Definition: Unit.h:2031
AuraApplicationMap m_appliedAuras
Definition: Unit.h:2032
static void HandleSafeUnitPointersOnDelete(Unit *thisUnit)
Definition: Unit.cpp:4329
SharedVisionList m_sharedVision
Definition: Unit.h:2051
void SetReferencedFromCurrent(bool yes)
Definition: Spell.h:562

References _DeleteRemovedAuras(), ASSERT, CURRENT_MAX_SPELL, HandleSafeUnitPointersOnDelete(), i_motionMaster, LOG_INFO, m_appliedAuras, m_attackers, m_attacking, m_charmInfo, m_Controlled, m_currentSpells, m_duringRemoveFromWorld, m_dynObj, m_gameObj, Player::m_isInSharedVisionOf, m_movedByPlayer, m_ownedAuras, m_removedAuras, m_sharedVision, movespline, and Spell::SetReferencedFromCurrent().

◆ Unit()

Unit::Unit ( bool  isWorldObject)
explicitprotected
203 : WorldObject(isWorldObject),
204 m_movedByPlayer(nullptr),
206 IsAIEnabled(false),
207 NeedChangeAI(false),
209 m_CreatedByPlayer(false),
211 i_AI(nullptr),
212 i_disabledAI(nullptr),
213 m_realRace(0),
214 m_race(0),
216 m_procDeep(0),
218 i_motionMaster(new MotionMaster(this)),
219 m_regenTimer(0),
220 m_ThreatMgr(this),
221 m_vehicle(nullptr),
222 m_vehicleKit(nullptr),
224 m_HostileRefMgr(this),
225 m_comboTarget(nullptr),
227{
228#ifdef _MSC_VER
229#pragma warning(default:4355)
230#endif
233
235
242
243 m_canDualWield = false;
244
245 m_rootTimes = 0;
246
247 m_state = 0;
248 m_deathState = DeathState::Alive;
249
250 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
251 m_currentSpells[i] = nullptr;
252
253 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
254 m_SummonSlot[i].Clear();
255
256 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
257 m_ObjectSlot[i].Clear();
258
260
261 m_interruptMask = 0;
262 m_transform = 0;
263 m_canModifyStats = false;
264
265 for (uint8 i = 0; i < MAX_SPELL_IMMUNITY; ++i)
266 m_spellImmune[i].clear();
267
268 for (uint8 i = 0; i < UNIT_MOD_END; ++i)
269 {
274 }
275 // implement 50% base damage from offhand
277
278 for (uint8 i = 0; i < MAX_ATTACK; ++i)
279 {
282
283 m_weaponDamage[i][MINDAMAGE][1] = 0.f;
284 m_weaponDamage[i][MAXDAMAGE][1] = 0.f;
285 }
286
287 for (uint8 i = 0; i < MAX_STATS; ++i)
288 m_createStats[i] = 0.0f;
289
290 m_attacking = nullptr;
291 m_modMeleeHitChance = 0.0f;
293 m_modSpellHitChance = 0.0f;
295
296 m_CombatTimer = 0;
297 m_lastManaUse = 0;
298
299 for (uint8 i = 0; i < MAX_SPELL_SCHOOL; ++i)
300 m_threatModifier[i] = 1.0f;
301
302 for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
303 m_speed_rate[i] = 1.0f;
304
305 m_charmInfo = nullptr;
306
308
309 // remove aurastates allowing special moves
310 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
311 m_reactiveTimer[i] = 0;
312
313 m_cleanupDone = false;
315
317
318 m_last_notify_position.Relocate(-5000.0f, -5000.0f, -5000.0f, 0.0f);
323
324 m_applyResilience = false;
325 _instantCast = false;
326
327 _lastLiquid = nullptr;
328
329 _oldFactionId = 0;
330
331 _isWalkingBeforeCharm = false;
332
334}
@ SERVERSIDE_VISIBILITY_GHOST
Definition: SharedDefines.h:1274
#define MAX_STATS
Definition: SharedDefines.h:265
constexpr auto MAX_SPELL_SCHOOL
Definition: SharedDefines.h:292
@ GHOST_VISIBILITY_ALIVE
Definition: SharedDefines.h:1281
#define MAX_SPELL_IMMUNITY
Definition: SharedDefines.h:1404
@ TYPEID_UNIT
Definition: ObjectGuid.h:35
@ TYPEMASK_UNIT
Definition: ObjectGuid.h:49
@ UPDATEFLAG_LIVING
Definition: UpdateData.h:44
@ UPDATEFLAG_STATIONARY_POSITION
Definition: UpdateData.h:45
@ MINDAMAGE
Definition: Unit.h:135
@ MAXDAMAGE
Definition: Unit.h:136
@ UNIT_MOD_DAMAGE_OFFHAND
Definition: Unit.h:166
@ UNIT_MOD_END
Definition: Unit.h:168
#define MAX_SUMMON_SLOT
Definition: Unit.h:601
@ OFF_ATTACK
Definition: Unit.h:210
@ MAX_ATTACK
Definition: Unit.h:212
@ BASE_ATTACK
Definition: Unit.h:209
@ RANGED_ATTACK
Definition: Unit.h:211
@ BASE_VALUE
Definition: Unit.h:126
@ TOTAL_VALUE
Definition: Unit.h:128
@ TOTAL_PCT
Definition: Unit.h:129
@ BASE_PCT
Definition: Unit.h:127
#define BASE_MAXDAMAGE
Definition: Unit.h:40
@ MAX_REACTIVE
Definition: Unit.h:593
#define MAX_GAMEOBJECT_SLOT
Definition: Unit.h:603
#define BASE_MINDAMAGE
Definition: Unit.h:39
@ UNIT_MASK_NONE
Definition: UnitDefines.h:134
#define MAX_MOVE_TYPE
Definition: UnitDefines.h:339
Definition: ThreatMgr.h:293
uint16 m_objectType
Definition: Object.h:240
uint16 m_updateFlag
Definition: Object.h:243
TypeID m_objectTypeId
Definition: Object.h:242
void SetValue(FLAG_TYPE flag, T_VALUES value)
Definition: Object.h:372
Definition: Object.h:405
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibility
Definition: Object.h:523
void Relocate(float x, float y)
Definition: Position.h:72
uint32 m_reactiveTimer[MAX_REACTIVE]
Definition: Unit.h:2055
uint32 m_lastSanctuaryTime
Definition: Unit.h:1959
LiquidTypeEntry const * _lastLiquid
Definition: Unit.h:2066
uint32 m_transform
Definition: Unit.h:2027
uint32 m_CombatTimer
Definition: Unit.h:2100
bool m_canModifyStats
Definition: Unit.h:2045
UnitAI * i_disabledAI
Definition: Unit.h:2004
bool NeedChangeAI
Definition: Unit.h:1966
uint32 m_state
Definition: Unit.h:2099
float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END]
Definition: Unit.h:2043
int32 m_attackTimer[MAX_ATTACK]
Definition: Unit.h:2011
float m_modAttackSpeedPct[3]
Definition: Unit.h:1953
uint8 m_realRace
Definition: Unit.h:2006
Vehicle * m_vehicle
Definition: Unit.h:2062
uint32 m_rootTimes
Definition: Unit.h:2072
uint8 m_race
Definition: Unit.h:2007
UnitAI * i_AI
Definition: Unit.h:2003
uint32 _lastExtraAttackSpell
Definition: Unit.h:2122
bool _instantCast
Definition: Unit.h:2070
ObjectGuid m_ObjectSlot[MAX_GAMEOBJECT_SLOT]
Definition: Unit.h:1945
RedirectThreatInfo _redirectThreatInfo
Definition: Unit.h:2114
float m_createStats[MAX_STATS]
Definition: Unit.h:2013
float m_modRangedHitChance
Definition: Unit.h:1948
DeathState m_deathState
Definition: Unit.h:2018
uint32 m_unitTypeMask
Definition: Unit.h:2065
uint32 m_removedAurasCount
Definition: Unit.h:2035
ThreatMgr m_ThreatMgr
Definition: Unit.h:2058
Unit * m_comboTarget
Definition: Unit.h:2110
AuraMap::iterator m_auraUpdateIterator
Definition: Unit.h:2034
bool m_AutoRepeatFirstCast
Definition: Unit.h:2009
uint16 m_delayed_unit_ai_notify_timer
Definition: Unit.h:1978
int32 m_regenTimer
Definition: Unit.h:2056
bool bRequestForcedVisibilityUpdate
Definition: Unit.h:1979
bool m_ControlledByPlayer
Definition: Unit.h:1968
uint32 m_last_notify_mstime
Definition: Unit.h:1976
SpellImmuneList m_spellImmune[MAX_SPELL_IMMUNITY]
Definition: Unit.h:1958
int8 m_comboPoints
Definition: Unit.h:2111
uint32 _oldFactionId
faction before charm
Definition: Unit.h:2119
int32 m_baseSpellCritChance
Definition: Unit.h:1950
float m_modMeleeHitChance
Definition: Unit.h:1947
float m_weaponDamage[MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
Definition: Unit.h:2044
Position m_last_notify_position
Definition: Unit.h:1975
Vehicle * m_vehicleKit
Definition: Unit.h:2063
bool IsAIEnabled
Definition: Unit.h:1965
HostileRefMgr m_HostileRefMgr
Definition: Unit.h:2106
bool m_applyResilience
Definition: Unit.h:2069
bool m_canDualWield
Definition: Unit.h:1938
uint32 m_interruptMask
Definition: Unit.h:2041
int32 m_procDeep
Definition: Unit.h:2020
float m_speed_rate[MAX_MOVE_TYPE]
Definition: Unit.h:2048
float m_modSpellHitChance
Definition: Unit.h:1949
ObjectGuid m_SummonSlot[MAX_SUMMON_SLOT]
Definition: Unit.h:1944
bool m_cleanupDone
Definition: Unit.h:2116
bool _isWalkingBeforeCharm
Are we walking before we were charmed?
Definition: Unit.h:2120
bool m_CreatedByPlayer
Definition: Unit.h:1969
uint16 m_delayed_unit_relocation_timer
Definition: Unit.h:1977
float m_threatModifier[MAX_SPELL_SCHOOL]
Definition: Unit.h:1952
uint32 m_lastManaUse
Definition: Unit.h:2101
Definition: MotionMaster.h:112
Definition: MoveSpline.h:40

References _instantCast, _isWalkingBeforeCharm, _lastExtraAttackSpell, _lastLiquid, _oldFactionId, _redirectThreatInfo, BASE_ATTACK, BASE_MAXDAMAGE, BASE_MINDAMAGE, BASE_PCT, BASE_VALUE, bRequestForcedVisibilityUpdate, CURRENT_MAX_SPELL, GHOST_VISIBILITY_ALIVE, m_applyResilience, m_attacking, m_attackTimer, m_auraModifiersGroup, m_auraUpdateIterator, m_baseSpellCritChance, m_canDualWield, m_canModifyStats, m_charmInfo, m_cleanupDone, m_CombatTimer, m_createStats, m_currentSpells, m_deathState, m_delayed_unit_ai_notify_timer, m_delayed_unit_relocation_timer, m_duringRemoveFromWorld, m_interruptMask, m_last_notify_mstime, m_last_notify_position, m_lastManaUse, m_modAttackSpeedPct, m_modMeleeHitChance, m_modRangedHitChance, m_modSpellHitChance, m_ObjectSlot, Object::m_objectType, Object::m_objectTypeId, m_ownedAuras, m_reactiveTimer, m_rootTimes, WorldObject::m_serverSideVisibility, m_speed_rate, m_spellImmune, m_state, m_SummonSlot, m_threatModifier, m_transform, Object::m_updateFlag, m_weaponDamage, MAX_ATTACK, MAX_GAMEOBJECT_SLOT, MAX_MOVE_TYPE, MAX_REACTIVE, MAX_SPELL_IMMUNITY, MAX_SPELL_SCHOOL, MAX_STATS, MAX_SUMMON_SLOT, MAXDAMAGE, MINDAMAGE, OFF_ATTACK, RANGED_ATTACK, Position::Relocate(), SERVERSIDE_VISIBILITY_GHOST, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), TOTAL_PCT, TOTAL_VALUE, TYPEID_UNIT, TYPEMASK_UNIT, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_END, UPDATEFLAG_LIVING, and UPDATEFLAG_STATIONARY_POSITION.

Member Function Documentation

◆ _addAttacker()

void Unit::_addAttacker ( Unit pAttacker)
inlineprivate
2095{ m_attackers.insert(pAttacker); }

References m_attackers.

Referenced by Attack().

◆ _AddAura()

void Unit::_AddAura ( UnitAura aura,
Unit caster 
)
4415{
4417 m_ownedAuras.insert(AuraMap::value_type(aura->GetId(), aura));
4418
4420
4421 if (aura->IsRemoved())
4422 return;
4423
4425 if (aura->IsSingleTarget())
4426 {
4427 ASSERT((IsInWorld() && !IsDuringRemoveFromWorld()) || (aura->GetCasterGUID() == GetGUID()));
4428 /* @HACK: Player is not in world during loading auras.
4429 * Single target auras are not saved or loaded from database
4430 * but may be created as a result of aura links (player mounts with passengers)
4431 */
4432
4433 // register single target aura
4434 caster->GetSingleCastAuras().push_back(aura);
4435 // remove other single target auras
4436 Unit::AuraList& scAuras = caster->GetSingleCastAuras();
4437 for (Unit::AuraList::iterator itr = scAuras.begin(); itr != scAuras.end();)
4438 {
4439 if ((*itr) != aura &&
4440 (*itr)->IsSingleTargetWith(aura))
4441 {
4442 (*itr)->Remove();
4443 itr = scAuras.begin();
4444 }
4445 else
4446 ++itr;
4447 }
4448 }
4449}
@ SPELL_AURA_CONTROL_VEHICLE
Definition: SpellAuraDefines.h:299
bool IsInWorld() const
Definition: Object.h:104
ObjectGuid GetGUID() const
Definition: Object.h:110
void _RemoveNoStackAurasDueToAura(Aura *aura)
Definition: Unit.cpp:4667
std::list< Aura * > AuraList
Definition: Unit.h:647
bool IsDuringRemoveFromWorld() const
Definition: Unit.h:668
AuraList & GetSingleCastAuras()
Definition: Unit.h:1350
ObjectGuid GetCasterGUID() const
Definition: SpellAuras.h:105
bool IsRemoved() const
Definition: SpellAuras.h:161
uint32 GetId() const
Definition: SpellAuras.cpp:466
bool HasEffectType(AuraType type) const
Definition: SpellAuras.cpp:1222
SpellInfo const * GetSpellInfo() const
Definition: SpellAuras.h:100
void SetIsSingleTarget(bool val)
Definition: SpellAuras.h:166
bool IsSingleTarget() const
Definition: SpellAuras.h:164
bool IsSingleTarget() const
Definition: SpellInfo.cpp:1374

References _RemoveNoStackAurasDueToAura(), ASSERT, Aura::GetCasterGUID(), Object::GetGUID(), Aura::GetId(), GetSingleCastAuras(), Aura::GetSpellInfo(), Aura::HasEffectType(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Aura::IsRemoved(), Aura::IsSingleTarget(), SpellInfo::IsSingleTarget(), Aura::IsSingleTargetWith(), m_cleanupDone, m_ownedAuras, Aura::SetIsSingleTarget(), and SPELL_AURA_CONTROL_VEHICLE.

Referenced by UnitAura::UnitAura().

◆ _ApplyAllAuraStatMods()

void Unit::_ApplyAllAuraStatMods ( )
5489{
5490 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5491 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, true);
5492}
@ AURA_EFFECT_HANDLE_STAT
Definition: SpellAuraDefines.h:46

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_ApplyAllStatBonuses().

◆ _ApplyAura()

void Unit::_ApplyAura ( AuraApplication aurApp,
uint8  effMask 
)
4506{
4507 Aura* aura = aurApp->GetBase();
4508
4510
4511 if (aurApp->GetRemoveMode())
4512 return;
4513
4514 Unit* caster = aura->GetCaster();
4515
4516 // Update target aura state flag
4517 SpellInfo const* spellInfo = aura->GetSpellInfo();
4518 if (AuraStateType aState = spellInfo->GetAuraState())
4519 {
4520 uint32 aStateMask = (1 << (aState - 1));
4521 // force update so the new caster registers it
4522 if ((aStateMask & PER_CASTER_AURA_STATE_MASK) && HasFlag(UNIT_FIELD_AURASTATE, aStateMask))
4524 else
4525 ModifyAuraState(aState, true);
4526 }
4527
4528 if (aurApp->GetRemoveMode())
4529 return;
4530
4531 // Sitdown on apply aura req seated
4534
4535 if (aurApp->GetRemoveMode())
4536 return;
4537
4538 aura->HandleAuraSpecificMods(aurApp, caster, true, false);
4539
4540 // apply effects of the aura
4541 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4542 {
4543 if (effMask & 1 << i && (!aurApp->GetRemoveMode()))
4544 aurApp->_HandleEffect(i, true);
4545 }
4546
4547 sScriptMgr->OnAuraApply(this, aura);
4548}
std::uint32_t uint32
Definition: Define.h:107
#define MAX_SPELL_EFFECTS
Definition: DBCStructure.h:1636
#define PER_CASTER_AURA_STATE_MASK
Definition: SharedDefines.h:1318
AuraStateType
Definition: SharedDefines.h:1288
@ AURA_INTERRUPT_FLAG_NOT_SEATED
Definition: SpellDefines.h:61
@ UNIT_FIELD_AURASTATE
Definition: UpdateFields.h:119
@ UNIT_STAND_STATE_SIT
Definition: UnitDefines.h:33
#define sScriptMgr
Definition: ScriptMgr.h:709
bool HasFlag(uint16 index, uint32 flag) const
Definition: Object.cpp:889
void ForceValuesUpdateAtIndex(uint32)
Definition: Object.cpp:2067
Definition: Unit.h:630
void ModifyAuraState(AuraStateType flag, bool apply)
Definition: Unit.cpp:10497
void SetStandState(uint8 state)
Definition: Unit.cpp:16727
bool IsSitState() const
Definition: Unit.cpp:16712
void _HandleEffect(uint8 effIndex, bool apply)
Definition: SpellAuras.cpp:161
Aura * GetBase() const
Definition: SpellAuras.h:62
AuraRemoveMode GetRemoveMode() const
Definition: SpellAuras.h:73
Definition: SpellAuras.h:87
Unit * GetCaster() const
Definition: SpellAuras.cpp:471
void HandleAuraSpecificMods(AuraApplication const *aurApp, Unit *caster, bool apply, bool onReapply)
Definition: SpellAuras.cpp:1265
Definition: SpellInfo.h:316
AuraStateType GetAuraState() const
Definition: SpellInfo.cpp:2060
uint32 AuraInterruptFlags
Definition: SpellInfo.h:353

References AuraApplication::_HandleEffect(), _RemoveNoStackAurasDueToAura(), AURA_INTERRUPT_FLAG_NOT_SEATED, SpellInfo::AuraInterruptFlags, Object::ForceValuesUpdateAtIndex(), SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), Aura::HandleAuraSpecificMods(), Object::HasFlag(), IsSitState(), MAX_SPELL_EFFECTS, ModifyAuraState(), PER_CASTER_AURA_STATE_MASK, SetStandState(), sScriptMgr, UNIT_FIELD_AURASTATE, and UNIT_STAND_STATE_SIT.

Referenced by _ApplyAuraEffect().

◆ _ApplyAuraEffect()

void Unit::_ApplyAuraEffect ( Aura aura,
uint8  effIndex 
)
4492{
4493 ASSERT(aura);
4494 ASSERT(aura->HasEffect(effIndex));
4496 ASSERT(aurApp);
4497 if (!aurApp->GetEffectMask())
4498 _ApplyAura(aurApp, 1 << effIndex);
4499 else
4500 aurApp->_HandleEffect(effIndex, true);
4501}
void _ApplyAura(AuraApplication *aurApp, uint8 effMask)
Definition: Unit.cpp:4505
Definition: SpellAuras.h:37
uint8 GetEffectMask() const
Definition: SpellAuras.h:66
bool HasEffect(uint8 effIndex) const
Definition: SpellAuras.h:173
const AuraApplication * GetApplicationOfTarget(ObjectGuid guid) const
Definition: SpellAuras.h:183

References _ApplyAura(), AuraApplication::_HandleEffect(), ASSERT, Aura::GetApplicationOfTarget(), AuraApplication::GetEffectMask(), Object::GetGUID(), and Aura::HasEffect().

◆ _CreateAuraApplication()

AuraApplication * Unit::_CreateAuraApplication ( Aura aura,
uint8  effMask 
)
4454{
4455 // can't apply aura on unit which is going to be deleted - to not create a memory leak
4457 // aura musn't be removed
4458 ASSERT(!aura->IsRemoved());
4459
4460 // aura mustn't be already applied on target
4461 ASSERT (!aura->IsAppliedOnTarget(GetGUID()) && "Unit::_CreateAuraApplication: aura musn't be applied on target");
4462
4463 SpellInfo const* aurSpellInfo = aura->GetSpellInfo();
4464 uint32 aurId = aurSpellInfo->Id;
4465
4466 // ghost spell check, allow apply any auras at player loading in ghost mode (will be cleanup after load)
4467 // Xinef: Added IsAllowingDeadTarget check
4468 if (!IsAlive() && !aurSpellInfo->IsDeathPersistent() && !aurSpellInfo->IsAllowingDeadTarget() && (!IsPlayer() || !ToPlayer()->GetSession()->PlayerLoading()))
4469 return nullptr;
4470
4471 Unit* caster = aura->GetCaster();
4472
4473 AuraApplication* aurApp = new AuraApplication(this, caster, aura, effMask);
4474 m_appliedAuras.insert(AuraApplicationMap::value_type(aurId, aurApp));
4475
4476 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4477 // xinef: even if it gets removed, it will be reapplied in a second
4478 if (aurSpellInfo->AuraInterruptFlags && this == aura->GetOwner())
4479 {
4480 m_interruptableAuras.push_back(aurApp);
4481 AddInterruptMask(aurSpellInfo->AuraInterruptFlags);
4482 }
4483
4484 if (AuraStateType aState = aura->GetSpellInfo()->GetAuraState())
4485 m_auraStateAuras.insert(AuraStateAurasMap::value_type(aState, aurApp));
4486
4487 aura->_ApplyForTarget(this, caster, aurApp);
4488 return aurApp;
4489}
bool IsPlayer() const
Definition: Object.h:197
Player * ToPlayer()
Definition: Object.h:198
void AddInterruptMask(uint32 mask)
Definition: Unit.h:1476
bool IsAlive() const
Definition: Unit.h:1654
AuraApplicationList m_interruptableAuras
Definition: Unit.h:2039
AuraStateAurasMap m_auraStateAuras
Definition: Unit.h:2040
WorldObject * GetOwner() const
Definition: SpellAuras.h:107
bool IsAppliedOnTarget(ObjectGuid guid) const
Definition: SpellAuras.h:185
virtual void _ApplyForTarget(Unit *target, Unit *caster, AuraApplication *auraApp)
Definition: SpellAuras.cpp:492
bool IsDeathPersistent() const
Definition: SpellInfo.cpp:1217
uint32 Id
Definition: SpellInfo.h:320
bool IsAllowingDeadTarget() const
Definition: SpellInfo.cpp:1227

References Aura::_ApplyForTarget(), AddInterruptMask(), ASSERT, SpellInfo::AuraInterruptFlags, SpellInfo::GetAuraState(), Aura::GetCaster(), Object::GetGUID(), Aura::GetOwner(), Aura::GetSpellInfo(), SpellInfo::Id, IsAlive(), SpellInfo::IsAllowingDeadTarget(), Aura::IsAppliedOnTarget(), SpellInfo::IsDeathPersistent(), Object::IsPlayer(), Aura::IsRemoved(), m_appliedAuras, m_auraStateAuras, m_cleanupDone, m_interruptableAuras, and Object::ToPlayer().

◆ _DeleteRemovedAuras()

void Unit::_DeleteRemovedAuras ( )
protected
3836{
3837 while (!m_removedAuras.empty())
3838 {
3839 delete m_removedAuras.front();
3840 m_removedAuras.pop_front();
3841 }
3842}

References m_removedAuras.

Referenced by _UpdateSpells(), and ~Unit().

◆ _EnterVehicle()

void Unit::_EnterVehicle ( Vehicle vehicle,
int8  seatId,
AuraApplication const *  aurApp = nullptr 
)
19656{
19657 // Must be called only from aura handler
19658 if (!IsAlive() || GetVehicleKit() == vehicle || vehicle->GetBase()->IsOnVehicle(this))
19659 return;
19660
19661 if (m_vehicle)
19662 {
19663 if (m_vehicle == vehicle)
19664 {
19665 if (seatId >= 0 && seatId != GetTransSeat())
19666 {
19667 LOG_DEBUG("vehicles", "EnterVehicle: {} leave vehicle {} seat {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), GetTransSeat(), seatId);
19668 ChangeSeat(seatId);
19669 }
19670
19671 return;
19672 }
19673 else
19674 {
19675 LOG_DEBUG("vehicles", "EnterVehicle: {} exit {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), vehicle->GetBase()->GetEntry());
19676 ExitVehicle();
19677 }
19678 }
19679
19680 if (!aurApp || aurApp->GetRemoveMode())
19681 return;
19682
19683 if (Player* player = ToPlayer())
19684 {
19685 if (vehicle->GetBase()->IsPlayer() && player->IsInCombat())
19686 return;
19687
19688 sScriptMgr->AnticheatSetUnderACKmount(player);
19689
19691 player->StopCastingCharm();
19692 player->StopCastingBindSight();
19693 Dismount();
19695
19696 // drop flag at invisible in bg
19697 if (Battleground* bg = player->GetBattleground())
19698 bg->EventPlayerDroppedFlag(player);
19699
19701 player->GetSession()->SendPacket(&data);
19702 }
19703
19704 ASSERT(!m_vehicle);
19705 m_vehicle = vehicle;
19706
19707 if (!m_vehicle->AddPassenger(this, seatId))
19708 {
19709 m_vehicle = nullptr;
19710 return;
19711 }
19712
19713 // Xinef: remove movement auras when entering vehicle (food buffs etc)
19715}
#define LOG_DEBUG(filterType__,...)
Definition: Log.h:169
@ AURA_INTERRUPT_FLAG_MOVE
Definition: SpellDefines.h:46
@ AURA_INTERRUPT_FLAG_TURNING
Definition: SpellDefines.h:47
@ SPELL_AURA_MOUNTED
Definition: SpellAuraDefines.h:141
@ SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA
Definition: Opcodes.h:1211
Definition: Battleground.h:303
uint32 GetEntry() const
Definition: Object.h:112
int8 GetTransSeat() const
Definition: Object.h:605
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
Definition: Unit.cpp:4129
void Dismount()
Definition: Unit.cpp:13524
bool IsOnVehicle(Unit const *vehicle) const
Definition: Unit.h:1787
void RemoveAurasByType(AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
Definition: Unit.cpp:5110
void ChangeSeat(int8 seatId, bool next=true)
Definition: Unit.cpp:19717
Vehicle * GetVehicleKit() const
Definition: Unit.h:1785
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except=0, bool isAutoshot=false)
Definition: Unit.cpp:5181
void ExitVehicle(Position const *exitPosition=nullptr)
Definition: Unit.cpp:19736
Unit * GetBase() const
May be called from scripts.
Definition: Vehicle.h:37
bool AddPassenger(Unit *passenger, int8 seatId=-1)
Definition: Vehicle.cpp:317
Definition: WorldPacket.h:26

References Vehicle::AddPassenger(), ASSERT, AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, ChangeSeat(), Dismount(), ExitVehicle(), Vehicle::GetBase(), Object::GetEntry(), AuraApplication::GetRemoveMode(), WorldObject::GetTransSeat(), GetVehicleKit(), InterruptNonMeleeSpells(), IsAlive(), IsOnVehicle(), Object::IsPlayer(), LOG_DEBUG, m_vehicle, RemoveAurasByType(), RemoveAurasWithInterruptFlags(), SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SPELL_AURA_MOUNTED, sScriptMgr, and Object::ToPlayer().

Referenced by AuraEffect::HandleAuraControlVehicle().

◆ _ExitVehicle()

void Unit::_ExitVehicle ( Position const *  exitPosition = nullptr)
19774{
19775 if (!m_vehicle)
19776 return;
19777
19778 // This should be done before dismiss, because there may be some aura removal
19781
19782 Player* player = ToPlayer();
19783
19784 // If player is on mouted duel and exits the mount should immediatly lose the duel
19785 if (player && player->duel && player->duel->IsMounted)
19786 player->DuelComplete(DUEL_FLED);
19787
19788 Vehicle* vehicle = m_vehicle;
19789 Unit* vehicleBase = m_vehicle->GetBase();
19790 m_vehicle = nullptr;
19791
19792 if (!vehicleBase)
19793 return;
19794
19795 SetControlled(false, UNIT_STATE_ROOT); // SMSG_MOVE_FORCE_UNROOT, ~MOVEMENTFLAG_ROOT
19796
19797 Position pos;
19798 // If we ask for a specific exit position, use that one. Otherwise allow scripts to modify it
19799 if (exitPosition)
19800 pos = *exitPosition;
19801 else
19802 {
19803 // Set exit position to vehicle position and use the current orientation
19804 pos = vehicleBase->GetPosition(); // This should use passenger's current position, leaving it as it is now
19805 pos.SetOrientation(vehicleBase->GetOrientation());
19806
19807 // Change exit position based on seat entry addon data
19808 if (seatAddon)
19809 {
19810 if (seatAddon->ExitParameter == VehicleExitParameters::VehicleExitParamOffset)
19811 pos.RelocateOffset({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO });
19812 else if (seatAddon->ExitParameter == VehicleExitParameters::VehicleExitParamDest)
19813 pos.Relocate({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO });
19814 }
19815 }
19816
19818
19819 if (player)
19820 {
19822
19823 sScriptMgr->AnticheatSetUnderACKmount(player);
19824 }
19826 {
19828 data << GetPackGUID();
19829 SendMessageToSet(&data, false);
19830 }
19831
19832 // xinef: hack for flameleviathan seat vehicle
19833 VehicleEntry const* vehicleInfo = vehicle->GetVehicleInfo();
19834 if (!vehicleInfo || vehicleInfo->m_ID != 341)
19835 {
19836 Movement::MoveSplineInit init(this);
19837 init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
19838 init.SetFacing(vehicleBase->GetOrientation());
19839 init.SetTransportExit();
19840 init.Launch();
19841 }
19842 else
19843 {
19844 float o = pos.GetAngle(this);
19845 Movement::MoveSplineInit init(this);
19846 init.MoveTo(pos.GetPositionX() + 8 * cos(o), pos.GetPositionY() + 8 * std::sin(o), pos.GetPositionZ() + 16.0f);
19847 init.SetFacing(GetOrientation());
19848 init.SetTransportExit();
19849 init.Launch();
19850 DisableSpline();
19851 KnockbackFrom(pos.GetPositionX(), pos.GetPositionY(), 10.0f, 20.0f);
19853 }
19854
19855 // xinef: move fall, should we support all creatures that exited vehicle in air? Currently Quest Drag and Drop only, Air Assault quest
19856 if (IsCreature() && !CanFly() && vehicleInfo && (vehicleInfo->m_ID == 113 || vehicleInfo->m_ID == 8 || vehicleInfo->m_ID == 290 || vehicleInfo->m_ID == 298))
19857 {
19859 }
19860
19861 if ((!player || !(player->GetDelayedOperations() & DELAYED_VEHICLE_TELEPORT)) && vehicle->GetBase()->HasUnitTypeMask(UNIT_MASK_MINION))
19862 if (((Minion*)vehicleBase)->GetOwner() == this)
19863 {
19864 if (!vehicleInfo || vehicleInfo->m_ID != 349)
19865 {
19866 vehicle->Dismiss();
19867 }
19868 else if (vehicleBase->IsCreature())
19869 {
19870 vehicle->Uninstall();
19871 vehicleBase->m_Events.AddEvent(new VehicleDespawnEvent(*vehicleBase, 2000), vehicleBase->m_Events.CalculateTime(2000));
19872 }
19873
19874 // xinef: ugly hack, no appripriate hook later to cast spell
19875 if (player)
19876 {
19877 if (vehicleBase->GetEntry() == NPC_EIDOLON_WATCHER)
19878 player->CastSpell(player, VEHICLE_SPELL_SHADE_CONTROL_END, true);
19879 else if (vehicleBase->GetEntry() == NPC_LITHE_STALKER)
19880 player->CastSpell(player, VEHICLE_SPELL_GEIST_CONTROL_END, true);
19881 }
19882 }
19883
19885 {
19886 // Vehicle just died, we die too
19887 if (vehicleBase->getDeathState() == DeathState::JustDied)
19888 setDeathState(DeathState::JustDied);
19889 // If for other reason we as minion are exiting the vehicle (ejected, master dismounted) - unsummon
19890 else
19891 ToTempSummon()->UnSummon(2000); // Approximation
19892 }
19893
19894 if (player)
19895 {
19897 player->SetCanTeleport(true);
19898 }
19899}
@ DUEL_FLED
Definition: SharedDefines.h:3614
@ DELAYED_VEHICLE_TELEPORT
Definition: Player.h:909
@ VEHICLE_SPELL_PARACHUTE
Definition: VehicleDefines.h:53
@ VEHICLE_SPELL_SHADE_CONTROL_END
Definition: VehicleDefines.h:56
@ VEHICLE_SPELL_GEIST_CONTROL_END
Definition: VehicleDefines.h:55
@ NPC_EIDOLON_WATCHER
Definition: VehicleDefines.h:69
@ NPC_LITHE_STALKER
Definition: VehicleDefines.h:70
@ MOVEMENTFLAG_ROOT
Definition: UnitDefines.h:355
@ UNIT_MASK_ACCESSORY
Definition: UnitDefines.h:144
@ UNIT_MASK_MINION
Definition: UnitDefines.h:136
@ UNIT_STATE_ROOT
Definition: UnitDefines.h:159
@ UNIT_STATE_MOVE
Definition: UnitDefines.h:168
@ SMSG_SPLINE_MOVE_UNROOT
Definition: Opcodes.h:802
Seconds GetGameTime()
Definition: GameTime.cpp:38
void AddEvent(BasicEvent *Event, uint64 e_time, bool set_addtime=true)
Definition: EventProcessor.h:103
uint64 CalculateTime(uint64 t_offset) const
Definition: EventProcessor.cpp:159
virtual void UnSummon(uint32 msTime=0)
Definition: TemporarySummon.cpp:282
Definition: TemporarySummon.h:76
PackedGuid const & GetPackGUID() const
Definition: Object.h:111
bool IsCreature() const
Definition: Object.h:201
virtual void SendMessageToSet(WorldPacket const *data, bool self) const
Definition: Object.cpp:2080
Definition: Position.h:27
void RelocateOffset(const Position &offset)
Definition: Position.cpp:59
float GetPositionZ() const
Definition: Position.h:118
float GetOrientation() const
Definition: Position.h:119
void SetOrientation(float orientation)
Definition: Position.h:111
float GetPositionX() const
Definition: Position.h:116
void GetPosition(float &x, float &y) const
Definition: Position.h:121
float GetPositionY() const
Definition: Position.h:117
float GetAngle(const Position *pos) const
Definition: Position.cpp:78
void SetCanTeleport(bool value)
Definition: Player.h:2481
void DuelComplete(DuelCompleteType type)
Definition: Player.cpp:6419
void SetFallInformation(uint32 time, float z)
Definition: Player.h:2319
std::unique_ptr< DuelInfo > duel
Definition: Player.h:1861
void ResummonPetTemporaryUnSummonedIfAny()
Definition: Player.cpp:14240
uint32 GetDelayedOperations() const
Definition: Player.h:2081
virtual void setDeathState(DeathState s, bool despawn=false)
Definition: Unit.cpp:14553
Unit * GetOwner() const
Definition: Unit.cpp:10600
DeathState getDeathState()
Definition: Unit.h:1651
virtual bool CanFly() const =0
MotionMaster * GetMotionMaster()
Definition: Unit.h:1620
TempSummon * ToTempSummon()
Definition: Unit.h:696
void DisableSpline()
Definition: Unit.cpp:636
void AddUnitState(uint32 f)
Definition: Unit.h:700
void SetControlled(bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
Definition: Unit.cpp:18035
EventProcessor m_Events
Definition: Unit.h:1956
bool HasUnitMovementFlag(uint32 f) const
Definition: Unit.h:736
SpellCastResult CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition: Unit.cpp:1167
uint32 HasUnitTypeMask(uint32 mask) const
Definition: Unit.h:706
void KnockbackFrom(float x, float y, float speedXY, float speedZ)
Definition: Unit.cpp:19144
Definition: Vehicle.h:28
void Dismiss()
Definition: Vehicle.cpp:538
VehicleEntry const * GetVehicleInfo() const
Definition: Vehicle.h:38
void RemovePassenger(Unit *passenger)
Definition: Vehicle.cpp:459
void Uninstall()
Definition: Vehicle.cpp:100
VehicleSeatAddon const * GetSeatAddonForSeatOfPassenger(Unit const *passenger) const
Definition: Vehicle.cpp:236
Definition: Vehicle.h:101
Definition: VehicleDefines.h:86
float ExitParameterO
Definition: VehicleDefines.h:96
float ExitParameterX
Definition: VehicleDefines.h:93
float ExitParameterY
Definition: VehicleDefines.h:94
float ExitParameterZ
Definition: VehicleDefines.h:95
VehicleExitParameters ExitParameter
Definition: VehicleDefines.h:97
void MoveFall(uint32 id=0, bool addFlagForNPC=false)
The unit will fall. Used when in the air. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:627
Definition: MoveSplineInit.h:71
Definition: DBCStructure.h:2026
uint32 m_ID
Definition: DBCStructure.h:2027

References EventProcessor::AddEvent(), AddUnitState(), EventProcessor::CalculateTime(), CanFly(), CastSpell(), DELAYED_VEHICLE_TELEPORT, DisableSpline(), Vehicle::Dismiss(), Player::duel, DUEL_FLED, Player::DuelComplete(), VehicleSeatAddon::ExitParameter, VehicleSeatAddon::ExitParameterO, VehicleSeatAddon::ExitParameterX, VehicleSeatAddon::ExitParameterY, VehicleSeatAddon::ExitParameterZ, Position::GetAngle(), Vehicle::GetBase(), getDeathState(), Player::GetDelayedOperations(), Object::GetEntry(), GameTime::GetGameTime(), GetMotionMaster(), Position::GetOrientation(), GetOwner(), Object::GetPackGUID(), Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Vehicle::GetSeatAddonForSeatOfPassenger(), Vehicle::GetVehicleInfo(), HasUnitMovementFlag(), HasUnitTypeMask(), Object::IsCreature(), KnockbackFrom(), Movement::MoveSplineInit::Launch(), m_Events, VehicleEntry::m_ID, m_vehicle, MotionMaster::MoveFall(), MOVEMENTFLAG_ROOT, Movement::MoveSplineInit::MoveTo(), NPC_EIDOLON_WATCHER, NPC_LITHE_STALKER, Position::Relocate(), Position::RelocateOffset(), Vehicle::RemovePassenger(), Player::ResummonPetTemporaryUnSummonedIfAny(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), SetControlled(), setDeathState(), Movement::MoveSplineInit::SetFacing(), Player::SetFallInformation(), Position::SetOrientation(), Movement::MoveSplineInit::SetTransportExit(), SMSG_SPLINE_MOVE_UNROOT, sScriptMgr, Object::ToPlayer(), ToTempSummon(), Vehicle::Uninstall(), UNIT_MASK_ACCESSORY, UNIT_MASK_MINION, UNIT_STATE_MOVE, UNIT_STATE_ROOT, TempSummon::UnSummon(), VEHICLE_SPELL_GEIST_CONTROL_END, VEHICLE_SPELL_PARACHUTE, and VEHICLE_SPELL_SHADE_CONTROL_END.

Referenced by AuraEffect::HandleAuraControlVehicle(), and boss_mimiron::boss_mimironAI::UpdateAI().

◆ _IsNoStackAuraDueToAura()

bool Unit::_IsNoStackAuraDueToAura ( Aura appliedAura,
Aura existingAura 
) const

◆ _IsValidAssistTarget()

bool Unit::_IsValidAssistTarget ( Unit const *  target,
SpellInfo const *  bySpell 
) const
14001{
14002 ASSERT(target);
14003
14004 // can assist to self
14005 if (this == target)
14006 return true;
14007
14008 // can't assist unattackable units or GMs
14009 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
14010 || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
14011 return false;
14012
14013 // can't assist own vehicle or passenger
14014 if (m_vehicle)
14015 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
14016 return false;
14017
14018 // can't assist invisible
14019 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && !CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()))
14020 return false;
14021
14022 // can't assist dead
14023 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
14024 return false;
14025
14026 // can't assist untargetable
14027 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
14028 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
14029 return false;
14030
14031 if (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
14032 {
14033 // xinef: do not allow to assist non attackable units
14034 if (target->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE))
14035 return false;
14036
14038 {
14039 if (target->IsImmuneToPC())
14040 return false;
14041 }
14042 else
14043 {
14044 if (target->IsImmuneToNPC())
14045 return false;
14046 }
14047 }
14048
14049 // can't assist non-friendly targets
14050 if (GetReactionTo(target) < REP_NEUTRAL
14051 && target->GetReactionTo(this) < REP_NEUTRAL
14052 && (!ToCreature() || !(ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)))
14053 return false;
14054
14055 // PvP case
14056 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
14057 {
14058 Player const* targetPlayerOwner = target->GetAffectingPlayer();
14060 {
14061 Player const* selfPlayerOwner = GetAffectingPlayer();
14062 if (selfPlayerOwner && targetPlayerOwner)
14063 {
14064 // can't assist player which is dueling someone
14065 if (selfPlayerOwner != targetPlayerOwner
14066 && targetPlayerOwner->duel)
14067 return false;
14068 }
14069 // can't assist player in ffa_pvp zone from outside
14070 if (target->IsFFAPvP() && !IsFFAPvP())
14071 return false;
14072
14073 // can't assist player out of sanctuary from sanctuary if has pvp enabled
14074 if (target->IsPvP())
14075 if (IsInSanctuary() && !target->IsInSanctuary())
14076 return false;
14077 }
14078 }
14079 // PvC case - player can assist creature only if has specific type flags
14080 // !target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) &&
14082 && (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
14083 && !target->IsPvP())
14084 {
14085 if (Creature const* creatureTarget = target->ToCreature())
14086 return creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT || creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_ASSIST;
14087 }
14088 return true;
14089}
@ REP_NEUTRAL
Definition: SharedDefines.h:183
@ CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT
Definition: SharedDefines.h:2721
@ CREATURE_TYPE_FLAG_CAN_ASSIST
Definition: SharedDefines.h:2707
@ SPELL_ATTR6_CAN_TARGET_UNTARGETABLE
Definition: SharedDefines.h:628
@ SPELL_ATTR6_IGNORE_PHASE_SHIFT
Definition: SharedDefines.h:617
@ SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC
Definition: SharedDefines.h:607
@ UNIT_STATE_UNATTACKABLE
Definition: UnitDefines.h:186
@ UNIT_FLAG_NON_ATTACKABLE
Definition: UnitDefines.h:230
@ UNIT_FLAG_NOT_SELECTABLE
Definition: UnitDefines.h:254
@ UNIT_FLAG_PLAYER_CONTROLLED
Definition: UnitDefines.h:232
Definition: Creature.h:43
Creature * ToCreature()
Definition: Object.h:202
bool CanSeeOrDetect(WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
Definition: Object.cpp:1726
ReputationRank GetReactionTo(Unit const *target, bool checkOriginalFaction=false) const
Definition: Unit.cpp:10064
bool HasUnitFlag(UnitFlags flags) const
Definition: Unit.h:712
bool IsInSanctuary() const
Definition: Unit.h:980
bool IsFFAPvP() const
Definition: Unit.h:982
Player * GetAffectingPlayer() const
Definition: Unit.cpp:10625

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_CAN_ASSIST, CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, GetAffectingPlayer(), Vehicle::GetBase(), GetReactionTo(), SpellInfo::HasAttribute(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), IsFFAPvP(), Player::IsGameMaster(), IsImmuneToNPC(), IsImmuneToPC(), IsInSanctuary(), IsOnVehicle(), Object::IsPlayer(), IsPvP(), m_vehicle, REP_NEUTRAL, SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC, SPELL_ATTR6_CAN_TARGET_UNTARGETABLE, SPELL_ATTR6_IGNORE_PHASE_SHIFT, Object::ToCreature(), Object::ToPlayer(), UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_STATE_UNATTACKABLE.

Referenced by SpellInfo::CheckExplicitTarget(), IsValidAssistTarget(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ _IsValidAttackTarget()

bool Unit::_IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell,
WorldObject const *  obj = nullptr 
) const
13878{
13879 ASSERT(target);
13880
13881 // can't attack self
13882 if (this == target)
13883 return false;
13884
13885 // can't attack unattackable units or GMs
13886 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
13887 || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
13888 return false;
13889
13890 // can't attack own vehicle or passenger
13891 if (m_vehicle)
13892 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
13893 if (!IsHostileTo(target)) // pussywizard: actually can attack own vehicle or passenger if it's hostile to us - needed for snobold in Gormok encounter
13894 return false;
13895
13896 // can't attack invisible (ignore stealth for aoe spells) also if the area being looked at is from a spell use the dynamic object created instead of the casting unit.
13897 //Ignore stealth if target is player and unit in combat with same player
13898 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && (obj ? !obj->CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()) : !CanSeeOrDetect(target, (bySpell && bySpell->IsAffectingArea()) || (target->IsPlayer() && target->HasStealthAura() && target->IsInCombat() && IsInCombatWith(target)))))
13899 return false;
13900
13901 // can't attack dead
13902 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
13903 return false;
13904
13905 // can't attack untargetable
13906 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
13907 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
13908 return false;
13909
13910 if (Player const* playerAttacker = ToPlayer())
13911 {
13912 if (playerAttacker->HasPlayerFlag(PLAYER_FLAGS_UBER) || playerAttacker->IsSpectator())
13913 return false;
13914 }
13915 // check flags
13917 || (!HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToNPC())
13918 || (!target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToNPC())
13919 || (HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToPC())
13920 // check if this is a world trigger cast - GOs are using world triggers to cast their spells, so we need to ignore their immunity flag here, this is a temp workaround, needs removal when go cast is implemented properly
13921 || ((GetEntry() != WORLD_TRIGGER && (!obj || !obj->isType(TYPEMASK_GAMEOBJECT | TYPEMASK_DYNAMICOBJECT))) && target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToPC()))
13922 return false;
13923
13924 // CvC case - can attack each other only when one of them is hostile
13926 return GetReactionTo(target) <= REP_HOSTILE || target->GetReactionTo(this) <= REP_HOSTILE;
13927
13928 // PvP, PvC, CvP case
13929 // can't attack friendly targets
13930 ReputationRank repThisToTarget = GetReactionTo(target);
13931 ReputationRank repTargetToThis;
13932
13933 if (repThisToTarget > REP_NEUTRAL
13934 || (repTargetToThis = target->GetReactionTo(this)) > REP_NEUTRAL)
13935 return false;
13936
13937 // Not all neutral creatures can be attacked (even some unfriendly faction does not react aggresive to you, like Sporaggar)
13938 if (repThisToTarget == REP_NEUTRAL &&
13939 repTargetToThis <= REP_NEUTRAL)
13940 {
13941 Player* owner = GetAffectingPlayer();
13942 Unit const* const thisUnit = owner ? owner : this;
13943 if (!(target->IsPlayer() && thisUnit->IsPlayer()) &&
13944 !(target->IsCreature() && thisUnit->IsCreature()))
13945 {
13946 Player const* player = target->IsPlayer() ? target->ToPlayer() : thisUnit->ToPlayer();
13947 Unit const* creature = target->IsCreature() ? target : thisUnit;
13948
13949 if (FactionTemplateEntry const* factionTemplate = creature->GetFactionTemplateEntry())
13950 {
13951 if (!(player->GetReputationMgr().GetForcedRankIfAny(factionTemplate)))
13952 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplate->faction))
13953 if (FactionState const* repState = player->GetReputationMgr().GetState(factionEntry))
13954 if (!(repState->Flags & FACTION_FLAG_AT_WAR))
13955 return false;
13956 }
13957 }
13958 }
13959
13960 Creature const* creatureAttacker = ToCreature();
13961 if (creatureAttacker && creatureAttacker->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)
13962 return false;
13963
13964 Player const* playerAffectingAttacker = HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? GetAffectingPlayer() : nullptr;
13965 Player const* playerAffectingTarget = target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? target->GetAffectingPlayer() : nullptr;
13966
13967 // check duel - before sanctuary checks
13968 if (playerAffectingAttacker && playerAffectingTarget)
13969 if (playerAffectingAttacker->duel && playerAffectingAttacker->duel->Opponent == playerAffectingTarget && playerAffectingAttacker->duel->State == DUEL_STATE_IN_PROGRESS)
13970 return true;
13971
13972 // PvP case - can't attack when attacker or target are in sanctuary
13973 // however, 13850 client doesn't allow to attack when one of the unit's has sanctuary flag and is pvp
13974 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && (target->IsInSanctuary() || IsInSanctuary()))
13975 return false;
13976
13977 // additional checks - only PvP case
13978 if (playerAffectingAttacker && playerAffectingTarget)
13979 {
13980 if (!IsPvP() && bySpell && bySpell->IsAffectingArea() && !bySpell->HasAttribute(SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK))
13981 return false;
13982
13983 if (target->IsPvP())
13984 return true;
13985
13986 if (IsFFAPvP() && target->IsFFAPvP())
13987 return true;
13988
13990 }
13991 return true;
13992}
@ FACTION_FLAG_AT_WAR
Definition: DBCEnums.h:308
@ SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK
Definition: SharedDefines.h:573
ReputationRank
Definition: SharedDefines.h:179
@ REP_HOSTILE
Definition: SharedDefines.h:181
@ DUEL_STATE_IN_PROGRESS
Definition: Player.h:372
@ PLAYER_FLAGS_UBER
Definition: Player.h:493
@ TYPEMASK_DYNAMICOBJECT
Definition: ObjectGuid.h:52
@ TYPEMASK_GAMEOBJECT
Definition: ObjectGuid.h:51
@ UNIT_FIELD_BYTES_2
Definition: UpdateFields.h:161
#define WORLD_TRIGGER
Definition: Unit.h:37
@ UNIT_BYTE2_FLAG_UNK1
Definition: UnitDefines.h:116
@ UNIT_FLAG_TAXI_FLIGHT
Definition: UnitDefines.h:249
@ UNIT_FLAG_NON_ATTACKABLE_2
Definition: UnitDefines.h:245
@ UNIT_FLAG_NOT_ATTACKABLE_1
Definition: UnitDefines.h:236
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
CreatureTemplate const * GetCreatureTemplate() const
Definition: Creature.h:205
uint32 type_flags
Definition: CreatureData.h:223
bool HasByteFlag(uint16 index, uint8 offset, uint8 flag) const
Definition: Object.cpp:949
ReputationMgr & GetReputationMgr()
Definition: Player.h:2108
FactionTemplateEntry const * GetFactionTemplateEntry() const
Definition: Unit.cpp:10034
bool IsPvP() const
Definition: Unit.h:981
bool IsInCombatWith(Unit const *who) const
Definition: Unit.cpp:21039
bool IsImmuneToNPC() const
Definition: Unit.h:879
bool IsHostileTo(Unit const *unit) const
Definition: Unit.cpp:10236
bool IsImmuneToPC() const
Definition: Unit.h:877
Definition: ReputationMgr.h:41
FactionState const * GetState(FactionEntry const *factionEntry) const
Definition: ReputationMgr.h:81
ReputationRank const * GetForcedRankIfAny(FactionTemplateEntry const *factionTemplateEntry) const
Definition: ReputationMgr.h:106
Definition: DBCStructure.h:906
Definition: DBCStructure.h:938

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, DUEL_STATE_IN_PROGRESS, FACTION_FLAG_AT_WAR, GetAffectingPlayer(), Vehicle::GetBase(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFactionTemplateEntry(), ReputationMgr::GetForcedRankIfAny(), GetReactionTo(), Player::GetReputationMgr(), ReputationMgr::GetState(), SpellInfo::HasAttribute(), Object::HasByteFlag(), HasStealthAura(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), Object::IsCreature(), IsFFAPvP(), Player::IsGameMaster(), IsHostileTo(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsInCombatWith(), IsInSanctuary(), IsOnVehicle(), Object::IsPlayer(), IsPvP(), Object::isType(), m_vehicle, PLAYER_FLAGS_UBER, REP_HOSTILE, REP_NEUTRAL, sFactionStore, SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK, SPELL_ATTR6_CAN_TARGET_UNTARGETABLE, SPELL_ATTR6_IGNORE_PHASE_SHIFT, Object::ToCreature(), Object::ToPlayer(), CreatureTemplate::type_flags, TYPEMASK_DYNAMICOBJECT, TYPEMASK_GAMEOBJECT, UNIT_BYTE2_FLAG_UNK1, UNIT_FIELD_BYTES_2, UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NON_ATTACKABLE_2, UNIT_FLAG_NOT_ATTACKABLE_1, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_TAXI_FLIGHT, UNIT_STATE_UNATTACKABLE, and WORLD_TRIGGER.

Referenced by SpellInfo::CheckExplicitTarget(), Spell::DoSpellHitOnUnit(), GetMagicHitRedirectTarget(), GetMeleeHitRedirectTarget(), IsValidAttackTarget(), Acore::AnyAoETargetUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ _RegisterAuraEffect()

void Unit::_RegisterAuraEffect ( AuraEffect aurEff,
bool  apply 
)
4697{
4698 if (apply)
4699 m_modAuras[aurEff->GetAuraType()].push_back(aurEff);
4700 else
4701 m_modAuras[aurEff->GetAuraType()].remove(aurEff);
4702}
AuraEffectList m_modAuras[TOTAL_AURAS]
Definition: Unit.h:2037
AuraType GetAuraType() const
Definition: SpellAuraEffects.cpp:447

References AuraEffect::GetAuraType(), and m_modAuras.

Referenced by AuraEffect::HandleEffect().

◆ _RegisterDynObject()

void Unit::_RegisterDynObject ( DynamicObject dynObj)
6119{
6120 m_dynObj.push_back(dynObj);
6121}

References m_dynObj.

Referenced by DynamicObject::BindToCaster().

◆ _RemoveAllAuraStatMods()

void Unit::_RemoveAllAuraStatMods ( )
5483{
5484 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5485 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, false);
5486}

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_RemoveAllStatBonuses().

◆ _removeAttacker()

void Unit::_removeAttacker ( Unit pAttacker)
inlineprivate
Note
: Call only in Unit::Attack()
2096{ m_attackers.erase(pAttacker); }

References m_attackers.

Referenced by Attack(), and AttackStop().

◆ _RemoveNoStackAuraApplicationsDueToAura()

void Unit::_RemoveNoStackAuraApplicationsDueToAura ( Aura aura)

◆ _RemoveNoStackAurasDueToAura()

void Unit::_RemoveNoStackAurasDueToAura ( Aura aura)
4668{
4669 //SpellInfo const* spellProto = aura->GetSpellInfo();
4670
4671 // passive spell special case (only non stackable with ranks)
4672
4673 // xinef: this check makes caster to have 2 area auras thanks to spec switch
4674 // if (spellProto->IsPassiveStackableWithRanks())
4675 // return;
4676
4677 bool remove = false;
4678 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
4679 {
4680 if (remove)
4681 {
4682 remove = false;
4683 i = m_appliedAuras.begin();
4684 }
4685
4686 if (aura->CanStackWith(i->second->GetBase(), true))
4687 continue;
4688
4690 if (i == m_appliedAuras.end())
4691 break;
4692 remove = true;
4693 }
4694}
@ AURA_REMOVE_BY_DEFAULT
Definition: SpellAuraDefines.h:392
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4776
bool CanStackWith(Aura const *checkAura, bool remove) const
Definition: SpellAuras.cpp:2021

References AURA_REMOVE_BY_DEFAULT, Aura::CanStackWith(), m_appliedAuras, and RemoveAura().

Referenced by _AddAura(), and _ApplyAura().

◆ _TryStackingOrRefreshingExistingAura()

Aura * Unit::_TryStackingOrRefreshingExistingAura ( SpellInfo const *  newAura,
uint8  effMask,
Unit caster,
int32 baseAmount = nullptr,
Item castItem = nullptr,
ObjectGuid  casterGUID = ObjectGuid::Empty,
bool  periodicReset = false 
)
4355{
4356 ASSERT(casterGUID || caster);
4357 if (!casterGUID)
4358 casterGUID = caster->GetGUID();
4359
4360 // Xinef: Hax for mixology, best solution qq
4361 if (sSpellMgr->GetSpellGroup(newAura->Id) == 1)
4362 return nullptr;
4363
4364 // passive and Incanter's Absorption and auras with different type can stack with themselves any number of times
4365 if (!newAura->IsMultiSlotAura())
4366 {
4367 // check if cast item changed
4368 ObjectGuid castItemGUID;
4369 if (castItem)
4370 castItemGUID = castItem->GetGUID();
4371
4372 // find current aura from spell and change it's stackamount, or refresh it's duration
4373 if (Aura* foundAura = GetOwnedAura(newAura->Id, newAura->HasAttribute(SPELL_ATTR0_CU_SINGLE_AURA_STACK) ? ObjectGuid::Empty : casterGUID, newAura->HasAttribute(SPELL_ATTR0_CU_ENCHANT_PROC) ? castItemGUID : ObjectGuid::Empty, 0))
4374 {
4375 // effect masks do not match
4376 // extremely rare case
4377 // let's just recreate aura
4378 if (effMask != foundAura->GetEffectMask())
4379 return nullptr;
4380
4381 // update basepoints with new values - effect amount will be recalculated in ModStackAmount
4382 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4383 {
4384 if (!foundAura->HasEffect(i))
4385 continue;
4386
4387 int bp;
4388 if (baseAmount)
4389 bp = *(baseAmount + i);
4390 else
4391 bp = foundAura->GetSpellInfo()->Effects[i].BasePoints;
4392
4393 int32* oldBP = const_cast<int32*>(&(foundAura->GetEffect(i)->m_baseAmount));
4394 *oldBP = bp;
4395 }
4396
4397 // correct cast item guid if needed
4398 if (castItemGUID != foundAura->GetCastItemGUID())
4399 {
4400 ObjectGuid* oldGUID = const_cast<ObjectGuid*>(&foundAura->m_castItemGuid);
4401 *oldGUID = castItemGUID;
4402 }
4403
4404 // try to increase stack amount
4405 foundAura->ModStackAmount(1, AURA_REMOVE_BY_DEFAULT, periodicReset);
4406 sScriptMgr->OnAuraApply(this, foundAura);
4407 return foundAura;
4408 }
4409 }
4410
4411 return nullptr;
4412}
std::int32_t int32
Definition: Define.h:103
@ SPELL_ATTR0_CU_ENCHANT_PROC
Definition: SpellInfo.h:176
@ SPELL_ATTR0_CU_SINGLE_AURA_STACK
Definition: SpellInfo.h:198
#define sSpellMgr
Definition: SpellMgr.h:825
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:109
Definition: ObjectGuid.h:118
static ObjectGuid const Empty
Definition: ObjectGuid.h:120
Aura * GetOwnedAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
Definition: Unit.cpp:4760

References ASSERT, AURA_REMOVE_BY_DEFAULT, ObjectGuid::Empty, Object::GetGUID(), GetOwnedAura(), SpellInfo::HasAttribute(), SpellInfo::Id, SpellInfo::IsMultiSlotAura(), MAX_SPELL_EFFECTS, SPELL_ATTR0_CU_ENCHANT_PROC, SPELL_ATTR0_CU_SINGLE_AURA_STACK, sScriptMgr, and sSpellMgr.

Referenced by Aura::TryRefreshStackOrCreate().

◆ _UnapplyAura() [1/2]

void Unit::_UnapplyAura ( AuraApplication aurApp,
AuraRemoveMode  removeMode 
)
4647{
4648 // aura can be removed from unit only if it's applied on it, shouldn't happen
4649 ASSERT(aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) == aurApp);
4650
4651 uint32 spellId = aurApp->GetBase()->GetId();
4652 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4653
4654 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4655 {
4656 if (iter->second == aurApp)
4657 {
4658 _UnapplyAura(iter, removeMode);
4659 return;
4660 }
4661 else
4662 ++iter;
4663 }
4664 ABORT();
4665}
#define ABORT
Definition: Errors.h:76
std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
Definition: Unit.h:641
void _UnapplyAura(AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
Definition: Unit.cpp:4551

References _UnapplyAura(), ABORT, ASSERT, Aura::GetApplicationOfTarget(), AuraApplication::GetBase(), Object::GetGUID(), Aura::GetId(), and m_appliedAuras.

◆ _UnapplyAura() [2/2]

void Unit::_UnapplyAura ( AuraApplicationMap::iterator &  i,
AuraRemoveMode  removeMode 
)
4552{
4553 AuraApplication* aurApp = i->second;
4554 ASSERT(aurApp);
4555 ASSERT(!aurApp->GetRemoveMode());
4556 ASSERT(aurApp->GetTarget() == this);
4557
4558 aurApp->SetRemoveMode(removeMode);
4559 Aura* aura = aurApp->GetBase();
4560 LOG_DEBUG("spells.aura", "Aura {} now is remove mode {}", aura->GetId(), removeMode);
4561
4562 // dead loop is killing the server probably
4563 ASSERT(m_removedAurasCount < 0xFFFFFFFF);
4564
4566
4567 Unit* caster = aura->GetCaster();
4568
4569 // Remove all pointers from lists here to prevent possible pointer invalidation on spellcast/auraapply/auraremove
4570 m_appliedAuras.erase(i);
4571
4572 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4573 // xinef: event if it gets removed, it will be reapplied in a second
4574 if (aura->GetSpellInfo()->AuraInterruptFlags && this == aura->GetOwner())
4575 {
4576 m_interruptableAuras.remove(aurApp);
4578 }
4579
4580 bool auraStateFound = false;
4581 AuraStateType auraState = aura->GetSpellInfo()->GetAuraState();
4582 if (auraState)
4583 {
4584 bool canBreak = false;
4585 // Get mask of all aurastates from remaining auras
4586 for (AuraStateAurasMap::iterator itr = m_auraStateAuras.lower_bound(auraState); itr != m_auraStateAuras.upper_bound(auraState) && !(auraStateFound && canBreak);)
4587 {
4588 if (itr->second == aurApp)
4589 {
4590 m_auraStateAuras.erase(itr);
4591 itr = m_auraStateAuras.lower_bound(auraState);
4592 canBreak = true;
4593 continue;
4594 }
4595 auraStateFound = true;
4596 ++itr;
4597 }
4598 }
4599
4600 aurApp->_Remove();
4601 aura->_UnapplyForTarget(this, caster, aurApp);
4602
4603 // remove effects of the spell - needs to be done after removing aura from lists
4604 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4605 {
4606 if (aurApp->HasEffect(itr))
4607 aurApp->_HandleEffect(itr, false);
4608 }
4609
4610 // all effect mustn't be applied
4611 ASSERT(!aurApp->GetEffectMask());
4612
4613 // Remove totem at next update if totem loses its aura
4614 if (aurApp->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE && IsTotem() && GetGUID() == aura->GetCasterGUID())
4615 {
4616 if (ToTotem()->GetSpell() == aura->GetId() && ToTotem()->GetTotemType() == TOTEM_PASSIVE)
4617 ToTotem()->setDeathState(DeathState::JustDied);
4618 }
4619
4620 // Remove aurastates only if needed and were not found
4621 if (auraState)
4622 {
4623 if (!auraStateFound)
4624 ModifyAuraState(auraState, false);
4625 else
4626 {
4627 // update for casters, some shouldn't 'see' the aura state
4628 uint32 aStateMask = (1 << (auraState - 1));
4629 if ((aStateMask & PER_CASTER_AURA_STATE_MASK) != 0)
4631 }
4632 }
4633
4634 aura->HandleAuraSpecificMods(aurApp, caster, false, false);
4635
4636 // only way correctly remove all auras from list
4637 //if (removedAuras != m_removedAurasCount) new aura may be added
4638 i = m_appliedAuras.begin();
4639
4640 sScriptMgr->OnAuraRemove(this, aurApp, removeMode);
4641
4642 if (this->ToCreature() && this->ToCreature()->IsAIEnabled)
4643 this->ToCreature()->AI()->OnAuraRemove(aurApp, removeMode);
4644}
@ AURA_REMOVE_BY_EXPIRE
Definition: SpellAuraDefines.h:395
@ TOTEM_PASSIVE
Definition: Totem.h:25
virtual void OnAuraRemove(AuraApplication *, AuraRemoveMode)
Definition: CreatureAI.h:225
CreatureAI * AI() const
Definition: Creature.h:140
void setDeathState(DeathState s, bool despawn=false) override
A creature can be in 4 different states: Alive, JustDied, Corpse, and JustRespawned....
Definition: TemporarySummon.cpp:395
Totem * ToTotem()
Definition: Unit.h:695
void UpdateInterruptMask()
Definition: Unit.cpp:754
bool IsTotem() const
Definition: Unit.h:756
Unit * GetTarget() const
Definition: SpellAuras.h:61
void SetRemoveMode(AuraRemoveMode mode)
Definition: SpellAuras.h:72
void _Remove()
Definition: SpellAuras.cpp:94
bool HasEffect(uint8 effect) const
Definition: SpellAuras.h:67
virtual void _UnapplyForTarget(Unit *target, Unit *caster, AuraApplication *auraApp)
Definition: SpellAuras.cpp:515

References AuraApplication::_HandleEffect(), AuraApplication::_Remove(), Aura::_UnapplyForTarget(), Creature::AI(), ASSERT, AURA_REMOVE_BY_EXPIRE, SpellInfo::AuraInterruptFlags, Object::ForceValuesUpdateAtIndex(), SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), Aura::GetCasterGUID(), AuraApplication::GetEffectMask(), Object::GetGUID(), Aura::GetId(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), AuraApplication::GetTarget(), Aura::HandleAuraSpecificMods(), AuraApplication::HasEffect(), IsAIEnabled, IsTotem(), LOG_DEBUG, m_appliedAuras, m_auraStateAuras, m_interruptableAuras, m_removedAurasCount, MAX_SPELL_EFFECTS, ModifyAuraState(), CreatureAI::OnAuraRemove(), PER_CASTER_AURA_STATE_MASK, Minion::setDeathState(), AuraApplication::SetRemoveMode(), sScriptMgr, Object::ToCreature(), TOTEM_PASSIVE, ToTotem(), UNIT_FIELD_AURASTATE, and UpdateInterruptMask().

Referenced by Aura::_Remove(), _UnapplyAura(), RemoveAllAuras(), RemoveAllAurasExceptType(), RemoveAllAurasOnDeath(), RemoveAllAurasRequiringDeadTarget(), RemoveAura(), and RemoveEvadeAuras().

◆ _UnregisterDynObject()

void Unit::_UnregisterDynObject ( DynamicObject dynObj)
6124{
6125 m_dynObj.remove(dynObj);
6126}

References m_dynObj.

Referenced by DynamicObject::UnbindFromCaster().

◆ _UpdateAutoRepeatSpell()

void Unit::_UpdateAutoRepeatSpell ( )
protected
3903{
3904 SpellInfo const* spellProto = nullptr;
3906 {
3908 }
3909
3910 if (!spellProto)
3911 {
3912 return;
3913 }
3914
3915 static uint32 const HUNTER_AUTOSHOOT = 75;
3916
3917 // Check "realtime" interrupts
3918 if ((IsPlayer() && ToPlayer()->isMoving()) || IsNonMeleeSpellCast(false, false, true, spellProto->Id == HUNTER_AUTOSHOOT))
3919 {
3920 // cancel wand shoot
3921 if (spellProto->Id != HUNTER_AUTOSHOOT)
3923 m_AutoRepeatFirstCast = true;
3924 return;
3925 }
3926
3928 {
3930 }
3931
3932 m_AutoRepeatFirstCast = false;
3933
3934 // Check for ranged attack timer
3936 {
3938 if (result != SPELL_CAST_OK)
3939 {
3940 if (spellProto->Id != HUNTER_AUTOSHOOT)
3941 {
3943 }
3944
3945 return;
3946 }
3947
3948 // We want to shoot
3949 Spell* spell = new Spell(this, spellProto, TRIGGERED_FULL_MASK);
3950 spell->prepare(&(m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_targets));
3951
3952 // Reset attack
3954 }
3955}
SpellCastResult
Definition: SharedDefines.h:948
@ SPELL_CAST_OK
Definition: SharedDefines.h:1138
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
Definition: SpellDefines.h:150
@ CURRENT_AUTOREPEAT_SPELL
Definition: Unit.h:540
void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
Definition: Unit.cpp:4060
bool IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
Definition: Unit.cpp:4099
void setAttackTimer(WeaponAttackType type, int32 time)
Definition: Unit.h:835
bool isMoving() const
Definition: Unit.h:1575
int32 getAttackTimer(WeaponAttackType type) const
Definition: Unit.h:837
bool isAttackReady(WeaponAttackType type=BASE_ATTACK) const
Definition: Unit.h:838
void resetAttackTimer(WeaponAttackType type=BASE_ATTACK)
Definition: Unit.cpp:642
Definition: Spell.h:287
SpellCastResult prepare(SpellCastTargets const *targets, AuraEffect const *triggeredByAura=nullptr)
Definition: Spell.cpp:3480
SpellCastResult CheckCast(bool strict)
Definition: Spell.cpp:5658
SpellInfo const *const m_spellInfo
Definition: Spell.h:523

References Spell::CheckCast(), CURRENT_AUTOREPEAT_SPELL, getAttackTimer(), SpellInfo::Id, InterruptSpell(), isAttackReady(), isMoving(), IsNonMeleeSpellCast(), Object::IsPlayer(), m_AutoRepeatFirstCast, m_currentSpells, Spell::m_spellInfo, Spell::prepare(), RANGED_ATTACK, resetAttackTimer(), setAttackTimer(), SPELL_CAST_OK, Object::ToPlayer(), and TRIGGERED_FULL_MASK.

Referenced by _UpdateSpells().

◆ _UpdateSpells()

void Unit::_UpdateSpells ( uint32  time)
protected
3845{
3848
3849 // remove finished spells from current pointers
3850 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
3851 {
3852 if (m_currentSpells[i] && m_currentSpells[i]->getState() == SPELL_STATE_FINISHED)
3853 {
3855 m_currentSpells[i] = nullptr; // remove pointer
3856 }
3857 }
3858
3859 // m_auraUpdateIterator can be updated in indirect called code at aura remove to skip next planned to update but removed auras
3861 {
3862 Aura* i_aura = m_auraUpdateIterator->second;
3863 ++m_auraUpdateIterator; // need shift to next for allow update if need into aura update
3864 i_aura->UpdateOwner(time, this);
3865 }
3866
3867 // remove expired auras - do that after updates(used in scripts?)
3868 for (AuraMap::iterator i = m_ownedAuras.begin(); i != m_ownedAuras.end();)
3869 {
3870 if (i->second->IsExpired())
3872 else if (i->second->GetSpellInfo()->IsChanneled() && i->second->GetCasterGUID() != GetGUID() && !ObjectAccessor::GetWorldObject(*this, i->second->GetCasterGUID()))
3873 RemoveOwnedAura(i, AURA_REMOVE_BY_CANCEL); // remove channeled auras when caster is not on the same map
3874 else
3875 ++i;
3876 }
3877
3878 for (VisibleAuraMap::iterator itr = m_visibleAuras.begin(); itr != m_visibleAuras.end(); ++itr)
3879 if (itr->second->IsNeedClientUpdate())
3880 itr->second->ClientUpdate();
3881
3883
3884 if (!m_gameObj.empty())
3885 {
3886 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
3887 {
3888 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
3889 if (!go->isSpawned())
3890 {
3891 go->SetOwnerGUID(ObjectGuid::Empty);
3892 go->SetRespawnTime(0);
3893 go->Delete();
3894 m_gameObj.erase(itr++);
3895 continue;
3896 }
3897 ++itr;
3898 }
3899 }
3900}
@ SPELL_STATE_FINISHED
Definition: Spell.h:229
@ AURA_REMOVE_BY_CANCEL
Definition: SpellAuraDefines.h:393
GameObject * GetGameObject(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:184
WorldObject * GetWorldObject(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:115
Definition: GameObject.h:120
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4705
void _UpdateAutoRepeatSpell()
Definition: Unit.cpp:3902
VisibleAuraMap m_visibleAuras
Definition: Unit.h:2046
void UpdateOwner(uint32 diff, WorldObject *owner)
Definition: SpellAuras.cpp:756

References _DeleteRemovedAuras(), _UpdateAutoRepeatSpell(), AURA_REMOVE_BY_CANCEL, AURA_REMOVE_BY_EXPIRE, CURRENT_AUTOREPEAT_SPELL, CURRENT_MAX_SPELL, ObjectGuid::Empty, ObjectAccessor::GetGameObject(), Object::GetGUID(), ObjectAccessor::GetWorldObject(), m_auraUpdateIterator, m_currentSpells, m_gameObj, m_ownedAuras, m_visibleAuras, RemoveOwnedAura(), Spell::SetReferencedFromCurrent(), SPELL_STATE_FINISHED, and Aura::UpdateOwner().

Referenced by Update().

◆ AddAura() [1/2]

Aura * Unit::AddAura ( SpellInfo const *  spellInfo,
uint8  effMask,
Unit target 
)
18880{
18881 if (!spellInfo)
18882 return nullptr;
18883
18884 if (target->IsImmunedToSpell(spellInfo))
18885 return nullptr;
18886
18887 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
18888 {
18889 if (!(effMask & (1 << i)))
18890 continue;
18891 if (target->IsImmunedToSpellEffect(spellInfo, i))
18892 effMask &= ~(1 << i);
18893 }
18894
18895 if (Aura* aura = Aura::TryRefreshStackOrCreate(spellInfo, effMask, target, this))
18896 {
18897 aura->ApplyForTargets();
18898 return aura;
18899 }
18900 return nullptr;
18901}
virtual bool IsImmunedToSpellEffect(SpellInfo const *spellInfo, uint32 index) const
Definition: Unit.cpp:13006
virtual bool IsImmunedToSpell(SpellInfo const *spellInfo, Spell const *spell=nullptr)
Definition: Unit.cpp:12916
static Aura * TryRefreshStackOrCreate(SpellInfo const *spellproto, uint8 tryEffMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool *refresh=nullptr, bool periodicReset=false)
Definition: SpellAuras.cpp:326

References Aura::ApplyForTargets(), IsImmunedToSpell(), IsImmunedToSpellEffect(), MAX_SPELL_EFFECTS, and Aura::TryRefreshStackOrCreate().

◆ AddAura() [2/2]

Aura * Unit::AddAura ( uint32  spellId,
Unit target 
)
18865{
18866 if (!target)
18867 return nullptr;
18868
18869 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
18870 if (!spellInfo)
18871 return nullptr;
18872
18873 if (!target->IsAlive() && !spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_DEAD_TARGET))
18874 return nullptr;
18875
18876 return AddAura(spellInfo, MAX_EFFECT_MASK, target);
18877}
#define MAX_EFFECT_MASK
Definition: DBCStructure.h:1637
@ SPELL_ATTR2_ALLOW_DEAD_TARGET
Definition: SharedDefines.h:456
@ SPELL_ATTR0_PASSIVE
Definition: SharedDefines.h:388
Aura * AddAura(uint32 spellId, Unit *target)
Definition: Unit.cpp:18864
bool HasAttribute(SpellAttr0 attribute) const
Definition: SpellInfo.h:415

References AddAura(), SpellInfo::HasAttribute(), IsAlive(), MAX_EFFECT_MASK, SPELL_ATTR0_PASSIVE, SPELL_ATTR2_ALLOW_DEAD_TARGET, and sSpellMgr.

Referenced by AddAura(), boss_grand_champion::boss_grand_championAI::AddCreatureAddonAuras(), Pet::AddToWorld(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::AttackStart(), boss_anzu::boss_anzu(), boss_the_lich_king::boss_the_lich_kingAI::boss_the_lich_kingAI(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), Spell::DoTriggersOnSpellHit(), npc_anubisath_sentinel::aqsentinelAI::GainSentinelAbility(), AuraEffect::HandleAuraDummy(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterAdd(), gm_commandscript::HandleGMVisibleCommand(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_transitus_shield_beam_aura::HandleOnEffectApply(), npc_pet_dk_dancing_rune_weapon::npc_pet_dk_dancing_rune_weaponAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), Guardian::InitStatsForLevel(), boss_gahzranka::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), npc_dalaran_warrior::npc_dalaran_warriorAI::JustEngagedWith(), boss_kelidan_the_breaker::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), Creature::LoadCreaturesAddon(), npc_brew_bubble::MoveInLineOfSight(), npc_pet_gen_plump_turkey::MovementInform(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_empowered_aura::OnPeriodic(), instance_stratholme::instance_stratholme_InstanceMapScript::OnPlayerEnter(), BattlefieldWG::OnPlayerEnterZone(), AreaTrigger_at_area_52_entrance::OnTrigger(), Player::ProcessDelayedOperations(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_corrupted_totem::Reset(), npc_troll_volunteer::npc_troll_volunteerAI::Reset(), npc_vengeful_shade::npc_vengeful_shadeAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), boss_magus_telestra::Reset(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_archavon::boss_archavonAI::Reset(), boss_emalon::boss_emalonAI::Reset(), boss_koralon::boss_koralonAI::Reset(), boss_toravon::boss_toravonAI::Reset(), npc_dalaran_mage::npc_dalaran_mageAI::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), npc_pet_pri_shadowfiend::Reset(), Player::SendInitialPacketsAfterAddToMap(), npc_corrupted_totem::SetAura(), SetAuraStack(), Player::SetGMVisible(), Player::SetIsSpectator(), npc_artorius::npc_artoriusAI::SpellHit(), npc_simone::npc_simoneAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::SpellHitTarget(), boss_netherspite::SwitchToPortalPhase(), boss_gyth::boss_gythAI::UpdateAI(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_tiger_matriarch_credit::npc_tiger_matriarch_creditAI::UpdateAI(), npc_tiger_matriarch::npc_tiger_matriarchAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), boss_netherspite::UpdatePortals(), and npc_emily::npc_emilyAI::WaypointReached().

◆ AddComboPointHolder()

void Unit::AddComboPointHolder ( Unit unit)
inline
967{ m_ComboPointHolders.insert(unit); }
std::unordered_set< Unit * > m_ComboPointHolders
Definition: Unit.h:2112

References m_ComboPointHolders.

Referenced by AddComboPoints().

◆ AddComboPoints() [1/2]

void Unit::AddComboPoints ( int8  count)
inline
964{ AddComboPoints(nullptr, count); }
void AddComboPoints(Unit *target, int8 count)
Definition: Unit.cpp:16839

References AddComboPoints().

Referenced by AddComboPoints().

◆ AddComboPoints() [2/2]

void Unit::AddComboPoints ( Unit target,
int8  count 
)
16840{
16841 if (!count)
16842 {
16843 return;
16844 }
16845
16846 if (target && target != m_comboTarget)
16847 {
16848 if (m_comboTarget)
16849 {
16851 }
16852
16853 m_comboTarget = target;
16854 m_comboPoints = count;
16855 target->AddComboPointHolder(this);
16856 }
16857 else
16858 {
16859 m_comboPoints = std::max<int8>(std::min<int8>(m_comboPoints + count, 5), 0);
16860 }
16861
16863}
void SendComboPoints()
Definition: Unit.cpp:16882
void AddComboPointHolder(Unit *unit)
Definition: Unit.h:967
void RemoveComboPointHolder(Unit *unit)
Definition: Unit.h:968

References AddComboPointHolder(), m_comboPoints, m_comboTarget, RemoveComboPointHolder(), and SendComboPoints().

Referenced by Spell::_handle_finish_phase(), AuraEffect::HandleAuraRetainComboPoints(), and ProcDamageAndSpellFor().

◆ AddExtraAttacks()

void Unit::AddExtraAttacks ( uint32  count)
2766{
2768 if (!targetGUID)
2769 {
2770 if (ObjectGuid selection = GetTarget())
2771 {
2772 targetGUID = selection; // Spell was cast directly (not triggered by aura)
2773 }
2774 else
2775 return;
2776 }
2777
2778 extraAttacksTargets[targetGUID] += count;
2779}
std::unordered_map< ObjectGuid, uint32 > extraAttacksTargets
Definition: Unit.h:2123
ObjectGuid _lastDamagedTargetGuid
Definition: Unit.h:2124
ObjectGuid GetTarget() const
Definition: Unit.h:818

References _lastDamagedTargetGuid, extraAttacksTargets, and GetTarget().

Referenced by Spell::EffectAddExtraAttacks().

◆ AddExtraUnitMovementFlag()

void Unit::AddExtraUnitMovementFlag ( uint16  f)
inline
740{ m_movementInfo.flags2 |= f; }
uint16 flags2
Definition: Object.h:280
MovementInfo m_movementInfo
Definition: Object.h:609

References MovementInfo::flags2, and WorldObject::m_movementInfo.

Referenced by Vehicle::InitMovementInfoForBase().

◆ addFollower()

void Unit::addFollower ( FollowerReference pRef)
inline
void insertFirst(LinkedListElement *pElem)
Definition: LinkedList.h:105
FollowerRefMgr m_FollowingRefMgr
Definition: Unit.h:2108

References LinkedListHead::insertFirst(), and m_FollowingRefMgr.

Referenced by FollowerReference::targetObjectBuildLink().

◆ AddGameObject()

void Unit::AddGameObject ( GameObject gameObj)
6180{
6181 if (!gameObj || gameObj->GetOwnerGUID())
6182 return;
6183
6184 m_gameObj.push_back(gameObj->GetGUID());
6185 gameObj->SetOwnerGUID(GetGUID());
6186
6187 if (IsPlayer() && gameObj->GetSpellId())
6188 {
6189 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(gameObj->GetSpellId());
6190 // Need disable spell use for owner
6191 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6192 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6193 ToPlayer()->AddSpellAndCategoryCooldowns(createBySpell, 0, nullptr, true);
6194 }
6195}
uint32 GetSpellId() const
Definition: GameObject.h:181
void SetOwnerGUID(ObjectGuid owner)
Definition: GameObject.h:163
ObjectGuid GetOwnerGUID() const
Definition: GameObject.h:173
void AddSpellAndCategoryCooldowns(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
Definition: Player.cpp:10917
bool IsCooldownStartedOnEvent() const
Definition: SpellInfo.cpp:1212

References Player::AddSpellAndCategoryCooldowns(), Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), SpellInfo::IsCooldownStartedOnEvent(), Object::IsPlayer(), m_gameObj, GameObject::SetOwnerGUID(), sSpellMgr, and Object::ToPlayer().

Referenced by Spell::EffectDuel(), Spell::EffectSummonObject(), Spell::EffectTransmitted(), npc_midsummer_bonfire::Ignite(), and WorldObject::SummonGameObject().

◆ addHatedBy()

void Unit::addHatedBy ( HostileReference pHostileReference)
inline

◆ AddInterruptMask()

void Unit::AddInterruptMask ( uint32  mask)
inline
1476{ m_interruptMask |= mask; }

References m_interruptMask.

Referenced by _CreateAuraApplication(), and Spell::handle_immediate().

◆ AddPetAura()

void Unit::AddPetAura ( PetAura const *  petSpell)
17299{
17300 if (!IsPlayer())
17301 return;
17302
17303 m_petAuras.insert(petSpell);
17304 if (Pet* pet = ToPlayer()->GetPet())
17305 pet->CastPetAura(petSpell);
17306 else if (Unit* charm = GetCharm())
17307 charm->CastPetAura(petSpell);
17308}
Pet * GetPet(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:215
Definition: Pet.h:41
Unit * GetCharm() const
Definition: Unit.cpp:10671
PetAuraSet m_petAuras
Definition: Unit.h:1963

References GetCharm(), Object::IsPlayer(), m_petAuras, and Object::ToPlayer().

Referenced by Spell::EffectDummy(), and AuraEffect::HandleAuraDummy().

◆ AddPlayerToVision()

void Unit::AddPlayerToVision ( Player player)
11170{
11171 if (m_sharedVision.empty())
11172 {
11173 setActive(true);
11174 SetWorldObject(true);
11175 }
11176 m_sharedVision.push_back(player);
11177 player->m_isInSharedVisionOf.insert(this);
11178}
void SetWorldObject(bool apply)
Definition: Object.cpp:1066
void setActive(bool isActiveObject)
Definition: Object.cpp:1085

References Player::m_isInSharedVisionOf, m_sharedVision, WorldObject::setActive(), and WorldObject::SetWorldObject().

◆ AddPointedBy()

void Unit::AddPointedBy ( SafeUnitPointer sup)
inline
1884{ SafeUnitPointerSet.insert(sup); }
std::set< SafeUnitPointer * > SafeUnitPointerSet
Definition: Unit.h:1972

References SafeUnitPointerSet.

Referenced by SafeUnitPointer::SetPointedTo().

◆ AddSpellCooldown()

virtual void Unit::AddSpellCooldown ( uint32  ,
uint32  ,
uint32  ,
bool  needSendToClient = false,
bool  forceSendToSpectator = false 
)
inlinevirtual

◆ AddThreat()

void Unit::AddThreat ( Unit victim,
float  fThreat,
SpellSchoolMask  schoolMask = SPELL_SCHOOL_MASK_NORMAL,
SpellInfo const *  threatSpell = nullptr 
)
14654{
14655 // Only mobs can manage threat lists
14657 {
14658 m_ThreatMgr.AddThreat(victim, fThreat, schoolMask, threatSpell);
14659 }
14660}
@ UNIT_STATE_EVADE
Definition: UnitDefines.h:170
void AddThreat(Unit *victim, float threat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition: ThreatMgr.cpp:436
bool HasUnitState(const uint32 f) const
Definition: Unit.h:701
bool CanHaveThreatList(bool skipAliveCheck=false) const
Definition: Unit.cpp:14614

References ThreatMgr::AddThreat(), CanHaveThreatList(), HasUnitState(), m_ThreatMgr, and UNIT_STATE_EVADE.

Referenced by Attack(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), boss_shade_of_aran::AttackStart(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::AttackStart(), npc_capernian::AttackStart(), npc_dirt_mound::ChaseNewTarget(), boss_buru::ChaseNewVictim(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DamageTaken(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DamageTaken(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), DealDamage(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), CreatureAI::DoZoneInCombat(), Spell::EffectThreat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), npc_raging_flames::FixateRandomTarget(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraDummy(), spell_morogrim_tidewalker_water_globule_new_target::HandleDummy(), HandleDummyAuraProc(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), AuraEffect::HandlePeriodicManaLeechAuraTick(), spell_frostwarden_handler_focus_fire::HandleScript(), spell_the_lich_king_vile_spirit_move_target_search::HandleScript(), spell_pursue::HandleScript(), Spell::HandleThreatSpells(), npc_supremus_punch_invisible_stalker::IsSummonedBy(), npc_tiger_matriarch::npc_tiger_matriarchAI::IsSummonedBy(), npc_little_ooze::npc_little_oozeAI::IsSummonedBy(), npc_malchezaar_axe::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), boss_buru::JustEngagedWith(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), boss_curator::JustSummoned(), boss_sacrolash::JustSummoned(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustSummoned(), npc_akama_illidan::JustSummoned(), boss_nethermancer_sepethrea::JustSummoned(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), boss_shade_of_akama::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), npc_pet_mage_mirror_image::MySelectNextTarget(), SmartScript::ProcessAction(), RemoveCharmedBy(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), boss_skarvald_the_constructor::Reset(), boss_dalronn_the_controller::Reset(), npc_pet_hunter_snake_trap::Reset(), boss_romulo::ScheduleCombat(), npc_thaladred::ScheduleEvents(), boss_supremus::SchedulePhase(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::SelectT(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_thrall_bfu::npc_thrall_bfuAI::SpawnWave(), npc_greengill_slave::npc_greengill_slaveAI::SpellHit(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHitTarget(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), brann_bronzebeard::brann_bronzebeardAI::SummonCreatures(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_sartura::UpdateAI(), npc_sartura_royal_guard::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), and npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI().

◆ AddToWorld()

void Unit::AddToWorld ( )
overridevirtual

Reimplemented from WorldObject.

15689{
15690 if (!IsInWorld())
15691 {
15693 }
15694}
void AddToWorld() override
Definition: Object.cpp:1176

References WorldObject::AddToWorld(), and Object::IsInWorld().

Referenced by Creature::AddToWorld(), Pet::AddToWorld(), and Player::AddToWorld().

◆ AddUnitMovementFlag()

◆ AddUnitState()

void Unit::AddUnitState ( uint32  f)
inline
700{ m_state |= f; }

References m_state.

Referenced by _ExitVehicle(), RandomMovementGenerator< T >::_setRandomLocation(), MotionTransport::AddPassenger(), Attack(), boss_prince_keleseth_icc::boss_prince_kelesethAI::boss_prince_kelesethAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::boss_prince_taldaramAI(), boss_prince_valanar_icc::boss_prince_valanarAI::boss_prince_valanarAI(), Creature::Create(), MotionTransport::CreateNPCPassenger(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_thorim::boss_thorimAI::DisableThorim(), boss_nightbane::DoAction(), WaypointMovementGenerator< Creature >::DoInitialize(), RandomMovementGenerator< T >::DoInitialize(), ChaseMovementGenerator< T >::DoInitialize(), WaypointMovementGenerator< Creature >::DoReset(), FlightPathMovementGenerator::DoReset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_jindo::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), Creature::FocusTarget(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), AuraEffect::HandleAuraModSchoolImmunity(), debug_commandscript::HandleDebugUnitStateCommand(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetCastSpellOpcode(), RotateMovementGenerator::Initialize(), DistractMovementGenerator::Initialize(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::InitializeAI(), Player::LoadFromDB(), boss_ayamiss::MovementInform(), boss_lady_vashj::MovementInform(), npc_pet_gen_moth::npc_pet_gen_moth(), npc_pet_gen_valkyr_guardian::npc_pet_gen_valkyr_guardian(), npc_pet_gen_wind_rider_cub::npc_pet_gen_wind_rider_cub(), npc_corrupted_totem::Reset(), boss_jedoga_shadowseeker::Reset(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::Reset(), npc_wild_wyrm::npc_wild_wyrmAI::Reset(), boss_hungarfen::Reset(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::Reset(), SetCharmedBy(), SetContestedPvP(), SetControlled(), SetCurrentCastedSpell(), Player::setDeathState(), Player::SetIsSpectator(), boss_urom::boss_uromAI::SpellHit(), WaypointMovementGenerator< Creature >::StartMove(), npc_madrigosa::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), and boss_svala::boss_svalaAI::UpdateAI().

◆ AddUnitTypeMask()

void Unit::AddUnitTypeMask ( uint32  mask)
inline
707{ m_unitTypeMask |= mask; }

References m_unitTypeMask.

◆ ApplyAttackTimePercentMod()

void Unit::ApplyAttackTimePercentMod ( WeaponAttackType  att,
float  val,
bool  apply 
)
17056{
17057 float remainingTimePct = std::max((float)m_attackTimer[att], 0.0f) / (GetAttackTime(att) * m_modAttackSpeedPct[att]);
17058 if (val > 0)
17059 {
17061 ApplyPercentModFloatValue(static_cast<uint16>(UNIT_FIELD_BASEATTACKTIME) + att, val, !apply);
17062 }
17063 else
17064 {
17066 ApplyPercentModFloatValue(static_cast<uint16>(UNIT_FIELD_BASEATTACKTIME) + att, -val, apply);
17067 }
17068 m_attackTimer[att] = uint32(GetAttackTime(att) * m_modAttackSpeedPct[att] * remainingTimePct);
17069}
void ApplyPercentModFloatVar(float &var, float val, bool apply)
Definition: Util.h:50
std::uint16_t uint16
Definition: Define.h:108
@ UNIT_FIELD_BASEATTACKTIME
Definition: UpdateFields.h:120
void ApplyPercentModFloatValue(uint16 index, float val, bool apply)
Definition: Object.cpp:829
uint32 GetAttackTime(WeaponAttackType att) const
Definition: Unit.h:864

References Object::ApplyPercentModFloatValue(), ApplyPercentModFloatVar(), GetAttackTime(), m_attackTimer, m_modAttackSpeedPct, and UNIT_FIELD_BASEATTACKTIME.

Referenced by Player::ApplyRatingMod(), AuraEffect::HandleAuraModRangedHaste(), AuraEffect::HandleModAttackSpeed(), AuraEffect::HandleModCombatSpeedPct(), AuraEffect::HandleModMeleeRangedSpeedPct(), AuraEffect::HandleModMeleeSpeedPct(), and AuraEffect::HandleRangedAmmoHaste().

◆ ApplyCastTimePercentMod()

void Unit::ApplyCastTimePercentMod ( float  val,
bool  apply 
)
17072{
17073 if (val > 0)
17075 else
17077}
@ UNIT_MOD_CAST_SPEED
Definition: UpdateFields.h:137

References Object::ApplyPercentModFloatValue(), and UNIT_MOD_CAST_SPEED.

Referenced by Player::ApplyRatingMod(), AuraEffect::HandleModCastingSpeed(), and AuraEffect::HandleModCombatSpeedPct().

◆ ApplyDiminishingAura()

void Unit::ApplyDiminishingAura ( DiminishingGroup  group,
bool  apply 
)
15127{
15128 // Checking for existing in the table
15129 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15130 {
15131 if (i->DRGroup != group)
15132 continue;
15133
15134 if (apply)
15135 i->stack += 1;
15136 else if (i->stack)
15137 {
15138 i->stack -= 1;
15139 // Remember time after last aura from group removed
15140 if (i->stack == 0)
15141 i->hitTime = GameTime::GetGameTimeMS().count();
15142 }
15143 break;
15144 }
15145}
Milliseconds GetGameTimeMS()
Definition: GameTime.cpp:43
Diminishing m_Diminishing
Definition: Unit.h:2104

References GameTime::GetGameTimeMS(), and m_Diminishing.

Referenced by UnitAura::_ApplyForTarget(), and UnitAura::_UnapplyForTarget().

◆ ApplyDiminishingToDuration()

float Unit::ApplyDiminishingToDuration ( DiminishingGroup  group,
int32 duration,
Unit caster,
DiminishingLevels  Level,
int32  limitduration 
)
15048{
15049 // xinef: dont apply diminish to self casts
15050 if (duration == -1 || group == DIMINISHING_NONE)
15051 return 1.0f;
15052
15053 // test pet/charm masters instead pets/charmeds
15054 Unit const* targetOwner = GetOwner();
15055 Unit const* casterOwner = caster->GetOwner();
15056
15057 // Duration of crowd control abilities on pvp target is limited by 10 sec. (2.2.0)
15058 if (limitduration > 0 && duration > limitduration)
15059 {
15060 Unit const* target = targetOwner ? targetOwner : this;
15061 Unit const* source = casterOwner ? casterOwner : caster;
15062
15063 if ((target->IsPlayer()
15065 && source->IsPlayer())
15066 duration = limitduration;
15067 }
15068
15069 float mod = 1.0f;
15070
15071 if (group == DIMINISHING_TAUNT)
15072 {
15073 if (IsCreature() && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS))
15074 {
15075 DiminishingLevels diminish = Level;
15076 switch (diminish)
15077 {
15079 break;
15081 mod = 0.65f;
15082 break;
15084 mod = 0.4225f;
15085 break;
15087 mod = 0.274625f;
15088 break;
15090 mod = 0.0f;
15091 break;
15092 default:
15093 break;
15094 }
15095 }
15096 }
15097 // Some diminishings applies to mobs too (for example, Stun)
15099 && ((targetOwner ? (targetOwner->IsPlayer()) : (IsPlayer()))
15100 || (IsCreature() && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH)))
15102 {
15103 DiminishingLevels diminish = Level;
15104 switch (diminish)
15105 {
15107 break;
15109 mod = 0.5f;
15110 break;
15112 mod = 0.25f;
15113 break;
15115 mod = 0.0f;
15116 break;
15117 default:
15118 break;
15119 }
15120 }
15121
15122 duration = int32(duration * mod);
15123 return mod;
15124}
@ DIMINISHING_NONE
Definition: SharedDefines.h:3258
@ DIMINISHING_TAUNT
Definition: SharedDefines.h:3276
@ DRTYPE_PLAYER
Definition: SharedDefines.h:3251
@ DRTYPE_ALL
Definition: SharedDefines.h:3252
DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group)
Definition: SpellMgr.cpp:245
DiminishingLevels
Definition: Unit.h:262
@ DIMINISHING_LEVEL_3
Definition: Unit.h:265
@ DIMINISHING_LEVEL_1
Definition: Unit.h:263
@ DIMINISHING_LEVEL_4
Definition: Unit.h:267
@ DIMINISHING_LEVEL_IMMUNE
Definition: Unit.h:266
@ DIMINISHING_LEVEL_TAUNT_IMMUNE
Definition: Unit.h:268
@ DIMINISHING_LEVEL_2
Definition: Unit.h:264
@ CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS
Definition: CreatureData.h:64
@ CREATURE_FLAG_EXTRA_ALL_DIMINISH
Definition: CreatureData.h:65
uint32 flags_extra
Definition: CreatureData.h:246

References CREATURE_FLAG_EXTRA_ALL_DIMINISH, CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS, DIMINISHING_LEVEL_1, DIMINISHING_LEVEL_2, DIMINISHING_LEVEL_3, DIMINISHING_LEVEL_4, DIMINISHING_LEVEL_IMMUNE, DIMINISHING_LEVEL_TAUNT_IMMUNE, DIMINISHING_NONE, DIMINISHING_TAUNT, DRTYPE_ALL, DRTYPE_PLAYER, CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), GetDiminishingReturnsGroupType(), GetOwner(), Object::IsCreature(), Object::IsPlayer(), and Object::ToCreature().

Referenced by Spell::DoSpellHitOnUnit().

◆ ApplyEffectModifiers()

float Unit::ApplyEffectModifiers ( SpellInfo const *  spellProto,
uint8  effect_index,
float  value 
) const
14830{
14831 if (Player* modOwner = GetSpellModOwner())
14832 {
14833 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_ALL_EFFECTS, value);
14834 switch (effect_index)
14835 {
14836 case 0:
14837 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT1, value);
14838 break;
14839 case 1:
14840 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT2, value);
14841 break;
14842 case 2:
14843 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT3, value);
14844 break;
14845 }
14846 }
14847 return value;
14848}
@ SPELLMOD_EFFECT2
Definition: SpellDefines.h:88
@ SPELLMOD_ALL_EFFECTS
Definition: SpellDefines.h:84
@ SPELLMOD_EFFECT3
Definition: SpellDefines.h:99
@ SPELLMOD_EFFECT1
Definition: SpellDefines.h:79
Player * GetSpellModOwner() const
Definition: Unit.cpp:16578

References GetSpellModOwner(), SpellInfo::Id, SPELLMOD_ALL_EFFECTS, SPELLMOD_EFFECT1, SPELLMOD_EFFECT2, and SPELLMOD_EFFECT3.

Referenced by spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), CalculateSpellAmount(), SpellEffectInfo::CalcValue(), and Spell::EffectSchoolDMG().

◆ ApplyResilience()

void Unit::ApplyResilience ( Unit const *  victim,
float *  crit,
int32 damage,
bool  isCrit,
CombatRating  type 
)
static
18929{
18930 // player mounted on multi-passenger mount is also classified as vehicle
18931 if (victim->IsVehicle() && !victim->IsPlayer())
18932 return;
18933
18934 Unit const* target = nullptr;
18935 if (victim->IsPlayer())
18936 target = victim;
18937 else if (victim->IsCreature())
18938 {
18939 if (Unit* owner = victim->GetOwner())
18940 if (owner->IsPlayer())
18941 target = owner;
18942 }
18943
18944 if (!target)
18945 return;
18946
18947 switch (type)
18948 {
18950 // Crit chance reduction works against nonpets
18951 if (crit)
18952 *crit -= target->GetMeleeCritChanceReduction();
18953 if (damage)
18954 {
18955 if (isCrit)
18956 *damage -= target->GetMeleeCritDamageReduction(*damage);
18957 *damage -= target->GetMeleeDamageReduction(*damage);
18958 }
18959 break;
18961 // Crit chance reduction works against nonpets
18962 if (crit)
18963 *crit -= target->GetRangedCritChanceReduction();
18964 if (damage)
18965 {
18966 if (isCrit)
18967 *damage -= target->GetRangedCritDamageReduction(*damage);
18968 *damage -= target->GetRangedDamageReduction(*damage);
18969 }
18970 break;
18972 // Crit chance reduction works against nonpets
18973 if (crit)
18974 *crit -= target->GetSpellCritChanceReduction();
18975 if (damage)
18976 {
18977 if (isCrit)
18978 *damage -= target->GetSpellCritDamageReduction(*damage);
18979 *damage -= target->GetSpellDamageReduction(*damage);
18980 }
18981 break;
18982 default:
18983 break;
18984 }
18985}
@ CR_CRIT_TAKEN_RANGED
Definition: Unit.h:232
@ CR_CRIT_TAKEN_SPELL
Definition: Unit.h:233
@ CR_CRIT_TAKEN_MELEE
Definition: Unit.h:231
float GetSpellCritChanceReduction() const
Definition: Unit.h:1197
float GetRangedCritChanceReduction() const
Definition: Unit.h:1196
uint32 GetSpellCritDamageReduction(uint32 damage) const
Definition: Unit.h:1201
float GetMeleeCritChanceReduction() const
Definition: Unit.h:1195
uint32 GetRangedDamageReduction(uint32 damage) const
Definition: Unit.h:1189
uint32 GetRangedCritDamageReduction(uint32 damage) const
Definition: Unit.h:1200
uint32 GetMeleeCritDamageReduction(uint32 damage) const
Definition: Unit.h:1199
uint32 GetSpellDamageReduction(uint32 damage) const
Definition: Unit.h:1190
uint32 GetMeleeDamageReduction(uint32 damage) const
Definition: Unit.h:1188

References CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, GetMeleeCritChanceReduction(), GetMeleeCritDamageReduction(), GetMeleeDamageReduction(), GetOwner(), GetRangedCritChanceReduction(), GetRangedCritDamageReduction(), GetRangedDamageReduction(), GetSpellCritChanceReduction(), GetSpellCritDamageReduction(), GetSpellDamageReduction(), Object::IsCreature(), Object::IsPlayer(), and IsVehicle().

Referenced by CalculateSpellDamageTaken(), GetUnitCriticalChance(), spell_valkyr_touch_aura::HandleEffectPeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and SpellTakenCritChance().

◆ ApplyResistanceBuffModsMod()

void Unit::ApplyResistanceBuffModsMod ( SpellSchools  school,
bool  positive,
float  val,
bool  apply 
)
inline
1126{ ApplyModSignedFloatValue(positive ? static_cast<uint16>(UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE) + school : static_cast<uint16>(UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE) + + school, val, apply); }
@ UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE
Definition: UpdateFields.h:157
@ UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE
Definition: UpdateFields.h:158
void ApplyModSignedFloatValue(uint16 index, float val, bool apply)
Definition: Object.cpp:822

References Object::ApplyModSignedFloatValue(), UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE, and UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE.

Referenced by AuraEffect::HandleAuraModResistance(), and AuraEffect::HandleAuraModResistanceExclusive().

◆ ApplyResistanceBuffModsPercentMod()

void Unit::ApplyResistanceBuffModsPercentMod ( SpellSchools  school,
bool  positive,
float  val,
bool  apply 
)
inline

◆ ApplySpellDispelImmunity()

void Unit::ApplySpellDispelImmunity ( SpellInfo const *  spellProto,
DispelType  type,
bool  apply 
)
13417{
13418 ApplySpellImmune(spellProto->Id, IMMUNITY_DISPEL, type, apply);
13419
13420 if (apply && spellProto->HasAttribute(SPELL_ATTR1_IMMUNITY_PURGES_EFFECT))
13421 {
13422 // Create dispel mask by dispel type
13423 uint32 dispelMask = SpellInfo::GetDispelMask(type);
13424 // Dispel all existing auras vs current dispel type
13426 for (AuraApplicationMap::iterator itr = auras.begin(); itr != auras.end();)
13427 {
13428 SpellInfo const* spell = itr->second->GetBase()->GetSpellInfo();
13429 if (spell->GetDispelMask() & dispelMask)
13430 {
13431 // Dispel aura
13432 RemoveAura(itr);
13433 }
13434 else
13435 ++itr;
13436 }
13437 }
13438}
@ SPELL_ATTR1_IMMUNITY_PURGES_EFFECT
Definition: SharedDefines.h:434
@ IMMUNITY_DISPEL
Definition: SharedDefines.h:1398
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
Definition: Unit.cpp:13389
std::multimap< uint32, AuraApplication * > AuraApplicationMap
Definition: Unit.h:639
AuraApplicationMap & GetAppliedAuras()
Definition: Unit.h:1304
uint32 GetDispelMask() const
Definition: SpellInfo.cpp:2041

References ApplySpellImmune(), GetAppliedAuras(), SpellInfo::GetDispelMask(), SpellInfo::HasAttribute(), SpellInfo::Id, IMMUNITY_DISPEL, RemoveAura(), and SPELL_ATTR1_IMMUNITY_PURGES_EFFECT.

Referenced by AuraEffect::HandleAuraModDispelImmunity().

◆ ApplySpellImmune()

void Unit::ApplySpellImmune ( uint32  spellId,
uint32  op,
uint32  type,
bool  apply,
SpellImmuneBlockType  blockType = SPELL_BLOCK_TYPE_ALL 
)
13390{
13391 if (apply)
13392 {
13393 // xinef: immunities with spellId 0 are intended to be applied only once (script purposes mosty)
13394 if (spellId == 0 && std::find_if(m_spellImmune[op].begin(), m_spellImmune[op].end(), spellIdImmunityPredicate(type)) != m_spellImmune[op].end())
13395 return;
13396
13397 SpellImmune immune;
13398 immune.spellId = spellId;
13399 immune.type = type;
13400 immune.blockType = blockType;
13401 m_spellImmune[op].push_back(std::move(immune));
13402 }
13403 else
13404 {
13405 for (SpellImmuneList::iterator itr = m_spellImmune[op].begin(); itr != m_spellImmune[op].end(); ++itr)
13406 {
13407 if (itr->spellId == spellId && itr->type == type)
13408 {
13409 m_spellImmune[op].erase(itr);
13410 break;
13411 }
13412 }
13413 }
13414}
Definition: Unit.cpp:13380
Definition: SpellDefines.h:174
uint32 blockType
Definition: SpellDefines.h:179
uint32 spellId
Definition: SpellDefines.h:177
uint32 type
Definition: SpellDefines.h:178

References SpellImmune::blockType, m_spellImmune, SpellImmune::spellId, and SpellImmune::type.

Referenced by Vehicle::ApplyAllImmunities(), boss_kelidan_the_breaker::ApplyImmunities(), ApplyMechanicImmune(), ApplySpellDispelImmunity(), boss_amanitar::boss_amanitar(), boss_anubarak_trial::boss_anubarak_trialAI::boss_anubarak_trialAI(), boss_grand_champion::boss_grand_championAI::boss_grand_championAI(), boss_icehowl::boss_icehowlAI::boss_icehowlAI(), boss_sindragosa::boss_sindragosaAI::boss_sindragosaAI(), boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_void_reaver::boss_void_reaver(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDmgImmunity(), AuraEffect::HandleAuraModEffectImmunity(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleAuraModStateImmunity(), Aura::HandleAuraSpecificMods(), spell_q13007_iron_colossus::HandleDummy(), spell_love_in_air_perfume_immune::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_dk_anti_magic_shell_self::HandleEffectApply(), spell_dk_pet_scaling::HandleEffectApply(), spell_dru_treant_scaling::HandleEffectApply(), spell_pet_hit_expertise_scalling::HandleEffectApply(), spell_mage_pet_scaling::HandleEffectApply(), spell_pri_shadowfiend_scaling::HandleEffectApply(), spell_sha_feral_spirit_scaling::HandleEffectApply(), spell_sha_fire_elemental_scaling::HandleEffectApply(), spell_warl_infernal_scaling::HandleEffectApply(), spell_love_in_air_perfume_immune::HandleEffectRemove(), spell_dk_anti_magic_shell_self::HandleEffectRemove(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), spell_illidan_shadow_prison_aura::HandleOnEffectApply(), spell_illidan_shadow_prison_aura::HandleOnEffectRemove(), npc_hyjal_jaina::hyjalJainaAI::hyjalJainaAI(), npc_pet_dk_army_of_the_dead::npc_pet_dk_army_of_the_deadAI::InitializeAI(), boss_hydross_the_unstable::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Player::LoadFromDB(), Creature::LoadSpellTemplateImmunity(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::MovementInform(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::npc_mageguard_dalaranAI(), npc_pos_freed_slave::npc_pos_freed_slaveAI::npc_pos_freed_slaveAI(), npc_target_dummy::npc_target_dummyAI::npc_target_dummyAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::npc_tournament_training_dummyAI(), npc_training_dummy::npc_training_dummyAI::npc_training_dummyAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::npc_ulduar_arachnopod_destroyerAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::npc_valkyr_shadowguardAI(), spell_yogg_saron_malady_of_the_mind_aura::OnApply(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_malady_of_the_mind_aura::OnRemove(), boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), npc_chesspiece::Reset(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_felblood_kaelthas::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::Reset(), npc_dark_iron_guzzler::Reset(), boss_mal_ganis::boss_mal_ganisAI::Reset(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), boss_gluth::boss_gluthAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_auriaya::boss_auriayaAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_supremus::Reset(), boss_kaelthas::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), boss_supremus::SchedulePhase(), boss_hydross_the_unstable::SetForm(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), Creature::UpdateEntry(), and npc_koltira_deathweaver::npc_koltira_deathweaverAI::WaypointReached().

◆ ApplyStatBuffMod()

void Unit::ApplyStatBuffMod ( Stats  stat,
float  val,
bool  apply 
)
inline
1020{ ApplyModSignedFloatValue((val > 0 ? static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat : static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat), val, apply); }
@ UNIT_FIELD_POSSTAT0
Definition: UpdateFields.h:146
@ UNIT_FIELD_NEGSTAT0
Definition: UpdateFields.h:151

References Object::ApplyModSignedFloatValue(), UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by Player::_ApplyItemBonuses(), Player::ApplyEnchantment(), and AuraEffect::HandleAuraModStat().

◆ ApplyStatPercentBuffMod()

void Unit::ApplyStatPercentBuffMod ( Stats  stat,
float  val,
bool  apply 
)
15338{
15339 if (val == -100.0f) // prevent set var to zero
15340 val = -99.99f;
15341 float var = GetStat(stat) * val / 100.0f;
15342 ApplyModSignedFloatValue((var > 0 ? static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat : static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat), var, apply);
15343}
float GetStat(Stats stat) const
Definition: Unit.h:995

References Object::ApplyModSignedFloatValue(), GetStat(), UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by AuraEffect::HandleModTotalPercentStat().

◆ ApplyTotalThreatModifier()

float Unit::ApplyTotalThreatModifier ( float  fThreat,
SpellSchoolMask  schoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
14642{
14643 if (!HasThreatAura() || fThreat < 0)
14644 return fThreat;
14645
14646 SpellSchools school = GetFirstSchoolInMask(schoolMask);
14647
14648 return fThreat * m_threatModifier[school];
14649}
SpellSchools
Definition: SharedDefines.h:282
SpellSchools GetFirstSchoolInMask(SpellSchoolMask mask)
Definition: SharedDefines.h:318
bool HasThreatAura() const
Definition: Unit.h:1692

References GetFirstSchoolInMask(), HasThreatAura(), and m_threatModifier.

Referenced by ThreatCalcHelper::calcThreat().

◆ Attack()

bool Unit::Attack ( Unit victim,
bool  meleeAttack 
)
Todo:
: Implement aggro range, detection range and assistance range templates
10273{
10274 if (!victim || victim == this)
10275 return false;
10276
10277 // dead units can neither attack nor be attacked
10278 if (!IsAlive() || !victim->IsAlive())
10279 return false;
10280
10281 // pussywizard: check map, world, phase >_> multithreading crash fix
10282 if (!IsInMap(victim) || !InSamePhase(victim))
10283 return false;
10284
10285 // player cannot attack in mount state
10286 if (IsPlayer() && IsMounted())
10287 return false;
10288
10289 // creatures cannot attack while evading
10290 Creature* creature = ToCreature();
10291 if (creature && creature->IsInEvadeMode())
10292 {
10293 return false;
10294 }
10295
10296 // creatures should not try to attack the player during polymorph
10297 if (creature && creature->IsPolymorphed())
10298 {
10299 return false;
10300 }
10301
10302 //if (HasUnitFlag(UNIT_FLAG_PACIFIED)) // pussywizard: why having this flag prevents from entering combat? it should just prevent melee attack
10303 // return false;
10304
10305 // nobody can attack GM in GM-mode
10306 if (victim->IsPlayer())
10307 {
10308 if (victim->ToPlayer()->IsGameMaster())
10309 return false;
10310 }
10311 else
10312 {
10313 if (victim->ToCreature()->IsEvadingAttacks())
10314 return false;
10315 }
10316
10317 // Unit with SPELL_AURA_SPIRIT_OF_REDEMPTION can not attack
10319 return false;
10320
10321 // remove SPELL_AURA_MOD_UNATTACKABLE at attack (in case non-interruptible spells stun aura applied also that not let attack)
10322 if (HasUnattackableAura())
10324
10325 if (m_attacking)
10326 {
10327 if (m_attacking == victim)
10328 {
10329 // switch to melee attack from ranged/magic
10330 if (meleeAttack)
10331 {
10333 {
10335 SendMeleeAttackStart(victim);
10336 return true;
10337 }
10338 }
10340 {
10342 SendMeleeAttackStop(victim);
10343 return true;
10344 }
10345 return false;
10346 }
10347
10348 // switch target
10349 InterruptSpell(CURRENT_MELEE_SPELL, true, true, true);
10350 if (!meleeAttack)
10352 }
10353
10354 if (m_attacking)
10356
10357 m_attacking = victim;
10359
10360 // Set our target
10361 SetTarget(victim->GetGUID());
10362
10363 if (meleeAttack)
10365
10366 // set position before any AI calls/assistance
10367 //if (IsCreature())
10368 // ToCreature()->SetCombatStartPosition(GetPositionX(), GetPositionY(), GetPositionZ());
10369 if (creature && !(IsControllableGuardian() && IsControlledByPlayer()))
10370 {
10371 // should not let player enter combat by right clicking target - doesn't helps
10372 SetInCombatWith(victim);
10373 if (victim->IsPlayer())
10374 victim->SetInCombatWith(this);
10375 AddThreat(victim, 0.0f);
10376
10378
10381 {
10382 creature->CallAssistance();
10383 }
10385
10387 }
10388
10389 // delay offhand weapon attack by 50% of the base attack time
10392
10393 if (meleeAttack)
10394 SendMeleeAttackStart(victim);
10395
10396 return true;
10397}
T CalculatePct(T base, U pct)
Definition: Util.h:61
@ EMOTE_ONESHOT_NONE
Definition: SharedDefines.h:1894
@ AI_REACTION_HOSTILE
Definition: SharedDefines.h:3242
@ SPELL_AURA_MOD_UNATTACKABLE
Definition: SpellAuraDefines.h:156
@ CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD
Definition: IWorld.h:283
@ UNIT_NPC_EMOTESTATE
Definition: UpdateFields.h:140
@ CURRENT_MELEE_SPELL
Definition: Unit.h:537
@ UNIT_STATE_MELEE_ATTACKING
Definition: UnitDefines.h:150
@ CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE
Definition: CreatureData.h:70
#define sWorld
Definition: World.h:443
void CallAssistance(Unit *target=nullptr)
Definition: Creature.cpp:2433
bool IsEvadingAttacks() const
Definition: Creature.h:135
void SetAssistanceTimer(uint32 value)
Definition: Creature.h:401
void SendAIReaction(AiReaction reactionType)
Definition: Creature.cpp:2421
bool IsInEvadeMode() const
Definition: Creature.h:134
float GetFloatValue(uint16 index) const
Definition: Object.cpp:317
bool InSamePhase(WorldObject const *obj) const
Definition: Object.h:447
bool IsInMap(WorldObject const *obj) const
Definition: Object.cpp:1285
bool IsGameMaster() const
Definition: Player.h:1158
bool HasOffhandWeaponForAttack() const
Definition: Unit.h:934
void ClearUnitState(uint32 f)
Definition: Unit.h:702
bool IsPolymorphed() const
Definition: Unit.cpp:16742
void AddThreat(Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition: Unit.cpp:14653
void _removeAttacker(Unit *pAttacker)
Definition: Unit.h:2096
void _addAttacker(Unit *pAttacker)
Definition: Unit.h:2095
void SetInCombatWith(Unit *enemy, uint32 duration=0)
Definition: Unit.cpp:13581
bool HasUnattackableAura() const
Definition: Unit.h:1694
bool IsMounted() const
Definition: Unit.h:1747
void SendMeleeAttackStart(Unit *victim, Player *sendTo=nullptr)
Definition: Unit.cpp:3061
bool IsControllableGuardian() const
Definition: Unit.h:753
void SetUInt32Value(uint16 index, uint32 value)
Definition: Unit.cpp:21317
void SendMeleeAttackStop(Unit *victim=nullptr)
Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or int...
Definition: Unit.cpp:3077
bool IsControlledByPlayer() const
Definition: Unit.h:1232
bool HasSpiritOfRedemptionAura() const
Definition: Unit.h:1665
virtual void SetTarget(ObjectGuid=ObjectGuid::Empty)=0

References _addAttacker(), _removeAttacker(), AddThreat(), AddUnitState(), AI_REACTION_HOSTILE, BASE_ATTACK, CalculatePct(), Creature::CallAssistance(), ClearUnitState(), CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD, CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE, CURRENT_MELEE_SPELL, EMOTE_ONESHOT_NONE, CreatureTemplate::flags_extra, getAttackTimer(), Creature::GetCreatureTemplate(), Object::GetFloatValue(), Object::GetGUID(), HasOffhandWeaponForAttack(), HasSpiritOfRedemptionAura(), HasUnattackableAura(), HasUnitState(), WorldObject::InSamePhase(), InterruptSpell(), IsAlive(), isAttackReady(), IsControllableGuardian(), IsControlledByPlayer(), Creature::IsEvadingAttacks(), Player::IsGameMaster(), Creature::IsInEvadeMode(), WorldObject::IsInMap(), IsMounted(), Object::IsPlayer(), IsPolymorphed(), m_attacking, OFF_ATTACK, RemoveAurasByType(), Creature::SendAIReaction(), SendMeleeAttackStart(), SendMeleeAttackStop(), Creature::SetAssistanceTimer(), setAttackTimer(), SetInCombatWith(), SetTarget(), SetUInt32Value(), SPELL_AURA_MOD_UNATTACKABLE, sWorld, Object::ToCreature(), Object::ToPlayer(), UNIT_FIELD_BASEATTACKTIME, UNIT_NPC_EMOTESTATE, and UNIT_STATE_MELEE_ATTACKING.

Referenced by UnitAI::AttackStart(), FollowerAI::AttackStart(), PossessedAI::AttackStart(), boss_ragnaros::boss_ragnarosAI::AttackStart(), npc_gunship_mage::npc_gunship_mageAI::AttackStart(), npc_gunship_gunner::npc_gunship_gunnerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::boss_malygosAI::AttackStart(), npc_nexus_lord::npc_nexus_lordAI::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), TurretAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), boss_jormungarAI::AttackStart(), boss_four_horsemen::boss_four_horsemenAI::AttackStart(), boss_magus_telestra::AttackStart(), boss_kologarn::boss_kologarnAI::AttackStart(), boss_mimiron::boss_mimironAI::AttackStart(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::AttackStart(), boss_razorscale::boss_razorscaleAI::AttackStart(), boss_lady_malande::AttackStart(), boss_the_lurker_below::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), boss_nazan::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), npc_capernian::AttackStart(), npc_pet_gen_gnomish_flame_turret::AttackStart(), UnitAI::AttackStartCaster(), ScriptedAI::AttackStartNoMove(), PetAI::DoAttack(), WorldSession::HandleAttackSwingOpcode(), spell_q12096_q12092_dummy::HandleDummy(), WorldSession::HandlePetActionHelper(), boss_halazzi::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_fathomguard_tidalvess::JustSummoned(), RemoveCharmedBy(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), Player::UpdateCharmedAI(), and npc_ranger_lilatha::WaypointReached().

◆ AttackerStateUpdate()

void Unit::AttackerStateUpdate ( Unit victim,
WeaponAttackType  attType = BASE_ATTACK,
bool  extra = false,
bool  ignoreCasting = false 
)
2566{
2568 {
2569 return;
2570 }
2571
2572 if (HasUnitState(UNIT_STATE_CANNOT_AUTOATTACK) && !extra && !ignoreCasting)
2573 {
2574 return;
2575 }
2576
2577 if (!victim->IsAlive())
2578 return;
2579
2580 if ((attType == BASE_ATTACK || attType == OFF_ATTACK) && !IsWithinLOSInMap(victim))
2581 return;
2582
2583 // CombatStart puts the target into stand state, so we need to cache sit state here to know if we should crit later
2584 const bool sittingVictim = victim->IsPlayer() && (victim->IsSitState() || victim->getStandState() == UNIT_STAND_STATE_SLEEP);
2585
2586 CombatStart(victim);
2588
2589 if (attType != BASE_ATTACK && attType != OFF_ATTACK)
2590 return; // ignore ranged case
2591
2592 if (!extra && _lastExtraAttackSpell)
2593 {
2595 }
2596
2597 bool meleeAttack = true;
2598
2599 // melee attack spell casted at main hand attack only - no normal melee dmg dealt
2600 if (attType == BASE_ATTACK && m_currentSpells[CURRENT_MELEE_SPELL] && !extra)
2601 {
2602 meleeAttack = false; // The melee attack is replaced by the melee spell
2603
2605 SpellCastResult castResult = meleeSpell->CheckCast(false);
2606 if (castResult != SPELL_CAST_OK)
2607 {
2608 meleeSpell->SendCastResult(castResult);
2609 meleeSpell->SendInterrupted(0);
2610
2611 meleeSpell->finish(false);
2612 meleeSpell->SetExecutedCurrently(false);
2613
2614 if (castResult == SPELL_FAILED_NO_POWER)
2615 {
2616 // Not enough rage, do a regular melee attack instead
2617 meleeAttack = true;
2618 }
2619 }
2620 else
2621 {
2622 meleeSpell->cast(true);
2623 }
2624 }
2625 if (meleeAttack)
2626 {
2627 // attack can be redirected to another target
2628 victim = GetMeleeHitRedirectTarget(victim);
2629 CalcDamageInfo damageInfo;
2630 CalculateMeleeDamage(victim, &damageInfo, attType, sittingVictim);
2631
2632 // Send log damage message to client
2633 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
2634 {
2635 Unit::DealDamageMods(victim, damageInfo.damages[i].damage, &damageInfo.damages[i].absorb);
2636 }
2637
2638 SendAttackStateUpdate(&damageInfo);
2639
2640 //TriggerAurasProcOnEvent(damageInfo);
2641
2642 _lastDamagedTargetGuid = victim->GetGUID();
2643
2644 DealMeleeDamage(&damageInfo, true);
2645
2646 DamageInfo dmgInfo(damageInfo);
2647 Unit::ProcDamageAndSpell(damageInfo.attacker, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, damageInfo.procEx, dmgInfo.GetDamage(),
2648 damageInfo.attackType, nullptr, nullptr, -1, nullptr, &dmgInfo);
2649
2650 if (IsPlayer())
2651 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (Player) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2652 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2653 else
2654 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (NPC) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2655 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2656
2657 // Let the pet know we've started attacking someting. Handles melee attacks only
2658 // Spells such as auto-shot and others handled in WorldSession::HandleCastSpellOpcode
2659 if (IsPlayer() && !m_Controlled.empty())
2660 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
2661 if (Unit* pet = *itr)
2662 if (pet->IsAlive() && pet->IsCreature())
2663 pet->ToCreature()->AI()->OwnerAttacked(victim);
2664 }
2665}
@ SPELL_FAILED_NO_POWER
Definition: SharedDefines.h:1034
@ AURA_INTERRUPT_FLAG_MELEE_ATTACK
Definition: SpellDefines.h:55
#define MAX_ITEM_PROTO_DAMAGES
Definition: ItemTemplate.h:613
@ UNIT_STAND_STATE_SLEEP
Definition: UnitDefines.h:35
@ UNIT_STATE_CANNOT_AUTOATTACK
Definition: UnitDefines.h:193
@ UNIT_FLAG_PACIFIED
Definition: UnitDefines.h:246
bool IsWithinLOSInMap(WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
Definition: Object.cpp:1347
std::string ToString() const
Definition: ObjectGuid.cpp:47
std::string ToString() const
Definition: Position.cpp:52
Definition: Unit.h:330
Definition: Unit.h:463
uint32 procAttacker
Definition: Unit.h:480
uint32 procVictim
Definition: Unit.h:481
struct CalcDamageInfo::@264 damages[MAX_ITEM_PROTO_DAMAGES]
uint32 absorb
Definition: Unit.h:471
uint32 damage
Definition: Unit.h:470
uint32 procEx
Definition: Unit.h:482
Unit * attacker
Definition: Unit.h:464
Unit * target
Definition: Unit.h:465
WeaponAttackType attackType
Definition: Unit.h:479
void SendAttackStateUpdate(CalcDamageInfo *damageInfo)
Definition: Unit.cpp:6479
void CombatStart(Unit *target, bool initialAggro=true)
Definition: Unit.cpp:13629
Unit * GetMeleeHitRedirectTarget(Unit *victim, SpellInfo const *spellInfo=nullptr)
Definition: Unit.cpp:11057
void CalculateMeleeDamage(Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
Definition: Unit.cpp:1464
static void ProcDamageAndSpell(Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
Definition: Unit.cpp:6378
uint8 getStandState() const
Definition: Unit.h:1642
void DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
Definition: Unit.cpp:1829
static void DealDamageMods(Unit const *victim, uint32 &damage, uint32 *absorb)
Definition: Unit.cpp:800
void cast(bool skipCheck=false)
Definition: Spell.cpp:3794
void SetExecutedCurrently(bool yes)
Definition: Spell.h:564
void SendInterrupted(uint8 result)
Definition: Spell.cpp:5179
static void SendCastResult(Player *caster, SpellInfo const *spellInfo, uint8 castCount, SpellCastResult result, SpellCustomErrors customError=SPELL_CUSTOM_ERROR_NONE)
Definition: Spell.cpp:4674
void finish(bool ok=true)
Definition: Spell.cpp:4487

References _lastDamagedTargetGuid, _lastExtraAttackSpell, CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::attackType, AURA_INTERRUPT_FLAG_MELEE_ATTACK, BASE_ATTACK, CalculateMeleeDamage(), Spell::cast(), Spell::CheckCast(), CombatStart(), CURRENT_MELEE_SPELL, CalcDamageInfo::damage, CalcDamageInfo::damages, DealDamageMods(), DealMeleeDamage(), Spell::finish(), DamageInfo::GetAbsorb(), DamageInfo::GetBlock(), DamageInfo::GetDamage(), Object::GetGUID(), GetMeleeHitRedirectTarget(), DamageInfo::GetResist(), getStandState(), HasUnitFlag(), HasUnitState(), IsAlive(), Object::IsPlayer(), IsSitState(), WorldObject::IsWithinLOSInMap(), LOG_DEBUG, m_Controlled, m_currentSpells, MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, CalcDamageInfo::procAttacker, ProcDamageAndSpell(), CalcDamageInfo::procEx, CalcDamageInfo::procVictim, RemoveAurasWithInterruptFlags(), SendAttackStateUpdate(), Spell::SendCastResult(), Spell::SendInterrupted(), Spell::SetExecutedCurrently(), SPELL_CAST_OK, SPELL_FAILED_NO_POWER, CalcDamageInfo::target, ObjectGuid::ToString(), Position::ToString(), UNIT_FLAG_PACIFIED, UNIT_STAND_STATE_SLEEP, and UNIT_STATE_CANNOT_AUTOATTACK.

Referenced by UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), HandleProcExtraAttackFor(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_daphne_stilwell::npc_daphne_stilwellAI::Update(), Player::Update(), boss_dred::boss_dredAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), and boss_the_lurker_below::UpdateAI().

◆ AttackStop()

bool Unit::AttackStop ( )

Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client.

10404{
10405 if (!m_attacking)
10406 return false;
10407
10408 Unit* victim = m_attacking;
10409
10411 m_attacking = nullptr;
10412
10413 // Clear our target
10415
10417
10419
10420 // reset only at real combat stop
10421 if (Creature* creature = ToCreature())
10422 {
10423 creature->SetNoCallAssistance(false);
10424
10425 if (creature->HasSearchedAssistance())
10426 {
10427 creature->SetNoSearchAssistance(false);
10428 }
10429 }
10430
10431 SendMeleeAttackStop(victim);
10432
10433 return true;
10434}

References _removeAttacker(), ClearUnitState(), CURRENT_MELEE_SPELL, ObjectGuid::Empty, InterruptSpell(), m_attacking, SendMeleeAttackStop(), SetTarget(), Object::ToCreature(), and UNIT_STATE_MELEE_ATTACKING.

Referenced by PetAI::_stopAttack(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CombatStop(), boss_jedoga_shadowseeker::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), advisor_baseAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_thekal::DamageTaken(), boss_viscidus::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), ScriptedAI::DoStopAttack(), Player::DuelComplete(), Spell::EffectSanctuary(), SmartAI::EnterEvadeMode(), Spell::finish(), WorldSession::HandleAttackStopOpcode(), spell_hun_scatter_shot::HandleDummy(), spell_mc_play_dead_aura::HandleEffectApply(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetStopAttack(), RotateMovementGenerator::Initialize(), boss_janalai::JustEngagedWith(), PetAI::KilledUnit(), MotionMaster::MoveSeekAssistance(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), PetSpellFail(), RemoveCharmedBy(), boss_janalai::Reset(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SetCharmedBy(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_heigan::boss_heiganAI::StartFightPhase(), boss_lord_valthalak::boss_lord_valthalakAI::StartTalking(), StopAttackFaction(), StopAttackingInvalidTarget(), boss_ouro::Submerge(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), PossessedAI::UpdateAI(), Player::UpdateFFAPvPFlag(), and Player::UpdateFFAPvPState().

◆ BuildAuraStateUpdateForTarget()

uint32 Unit::BuildAuraStateUpdateForTarget ( Unit target) const
10537{
10539 for (AuraStateAurasMap::const_iterator itr = m_auraStateAuras.begin(); itr != m_auraStateAuras.end(); ++itr)
10540 if ((1 << (itr->first - 1)) & PER_CASTER_AURA_STATE_MASK)
10541 if (itr->second->GetBase()->GetCasterGUID() == target->GetGUID())
10542 auraStates |= (1 << (itr->first - 1));
10543
10544 return auraStates;
10545}
uint32 GetUInt32Value(uint16 index) const
Definition: Object.cpp:305

References Object::GetGUID(), Object::GetUInt32Value(), m_auraStateAuras, PER_CASTER_AURA_STATE_MASK, and UNIT_FIELD_AURASTATE.

Referenced by PatchValuesUpdate().

◆ BuildCooldownPacket() [1/2]

void Unit::BuildCooldownPacket ( WorldPacket data,
uint8  flags,
PacketCooldowns const &  cooldowns 
)
20996{
20997 data.Initialize(SMSG_SPELL_COOLDOWN, 8 + 1 + (4 + 4) * cooldowns.size());
20998 data << GetGUID();
20999 data << uint8(flags);
21000 for (std::unordered_map<uint32, uint32>::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
21001 {
21002 data << uint32(itr->first);
21003 data << uint32(itr->second);
21004 }
21005}
@ SMSG_SPELL_COOLDOWN
Definition: Opcodes.h:338
void Initialize(uint16 opcode, std::size_t newres=200)
Definition: WorldPacket.h:68

References Object::GetGUID(), WorldPacket::Initialize(), and SMSG_SPELL_COOLDOWN.

◆ BuildCooldownPacket() [2/2]

◆ BuildHeartBeatMsg()

void Unit::BuildHeartBeatMsg ( WorldPacket data) const
2074{
2075 data->Initialize(MSG_MOVE_HEARTBEAT, 32);
2076 *data << GetPackGUID();
2077 BuildMovementPacket(data);
2078}
@ MSG_MOVE_HEARTBEAT
Definition: Opcodes.h:268
void BuildMovementPacket(ByteBuffer *data) const
Definition: Unit.cpp:19901

References BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), and MSG_MOVE_HEARTBEAT.

Referenced by boss_volkhan::boss_volkhanAI::MovementInform(), and SendMovementFlagUpdate().

◆ BuildMovementPacket()

void Unit::BuildMovementPacket ( ByteBuffer data) const
19902{
19903 *data << uint32(GetUnitMovementFlags()); // movement flags
19904 *data << uint16(GetExtraUnitMovementFlags()); // 2.3.0
19905 *data << uint32(GameTime::GetGameTimeMS().count()); // time / counter
19906 *data << GetPositionX();
19907 *data << GetPositionY();
19908 *data << GetPositionZ();
19909 *data << GetOrientation();
19910
19911 // 0x00000200
19913 {
19914 if (m_vehicle)
19915 *data << m_vehicle->GetBase()->GetPackGUID();
19916 else if (GetTransport())
19917 *data << GetTransport()->GetPackGUID();
19918 else
19919 *data << (uint8)0;
19920
19921 *data << float (GetTransOffsetX());
19922 *data << float (GetTransOffsetY());
19923 *data << float (GetTransOffsetZ());
19924 *data << float (GetTransOffsetO());
19925 *data << uint32(GetTransTime());
19926 *data << uint8 (GetTransSeat());
19927
19930 }
19931
19932 // 0x02200000
19935 *data << (float)m_movementInfo.pitch;
19936
19937 *data << (uint32)m_movementInfo.fallTime;
19938
19939 // 0x00001000
19941 {
19942 *data << (float)m_movementInfo.jump.zspeed;
19943 *data << (float)m_movementInfo.jump.sinAngle;
19944 *data << (float)m_movementInfo.jump.cosAngle;
19945 *data << (float)m_movementInfo.jump.xyspeed;
19946 }
19947
19948 // 0x04000000
19950 *data << (float)m_movementInfo.splineElevation;
19951}
@ MOVEMENTFLAG_ONTRANSPORT
Definition: UnitDefines.h:353
@ MOVEMENTFLAG_FLYING
Definition: UnitDefines.h:369
@ MOVEMENTFLAG_FALLING
Definition: UnitDefines.h:356
@ MOVEMENTFLAG_SWIMMING
Definition: UnitDefines.h:365
@ MOVEMENTFLAG_SPLINE_ELEVATION
Definition: UnitDefines.h:370
@ MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING
Definition: UnitDefines.h:405
@ MOVEMENTFLAG2_INTERPOLATED_MOVEMENT
Definition: UnitDefines.h:410
struct MovementInfo::JumpInfo jump
uint32 fallTime
Definition: Object.h:307
struct MovementInfo::TransportInfo transport
float splineElevation
Definition: Object.h:321
float pitch
Definition: Object.h:304
uint32 time2
Definition: Object.h:300
float cosAngle
Definition: Object.h:317
float xyspeed
Definition: Object.h:317
float zspeed
Definition: Object.h:317
float sinAngle
Definition: Object.h:317
float GetTransOffsetX() const
Definition: Object.h:600
float GetTransOffsetY() const
Definition: Object.h:601
float GetTransOffsetZ() const
Definition: Object.h:602
uint32 GetTransTime() const
Definition: Object.h:604
Transport * GetTransport() const
Definition: Object.h:599
float GetTransOffsetO() const
Definition: Object.h:603
uint32 GetUnitMovementFlags() const
Definition: Unit.h:737
uint16 GetExtraUnitMovementFlags() const
Definition: Unit.h:743

References MovementInfo::JumpInfo::cosAngle, MovementInfo::fallTime, MovementInfo::flags2, Vehicle::GetBase(), GetExtraUnitMovementFlags(), GameTime::GetGameTimeMS(), Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransOffsetO(), WorldObject::GetTransOffsetX(), WorldObject::GetTransOffsetY(), WorldObject::GetTransOffsetZ(), WorldObject::GetTransport(), WorldObject::GetTransSeat(), WorldObject::GetTransTime(), GetUnitMovementFlags(), MovementInfo::jump, WorldObject::m_movementInfo, m_vehicle, MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING, MOVEMENTFLAG2_INTERPOLATED_MOVEMENT, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_FLYING, MOVEMENTFLAG_ONTRANSPORT, MOVEMENTFLAG_SPLINE_ELEVATION, MOVEMENTFLAG_SWIMMING, MovementInfo::pitch, MovementInfo::JumpInfo::sinAngle, MovementInfo::splineElevation, MovementInfo::TransportInfo::time2, MovementInfo::transport, MovementInfo::JumpInfo::xyspeed, and MovementInfo::JumpInfo::zspeed.

Referenced by BuildHeartBeatMsg(), Object::BuildMovementUpdate(), WorldSession::HandleMoveKnockBackAck(), Player::SendTeleportAckPacket(), SendTeleportPacket(), Player::SetCanFly(), Creature::SetCanFly(), Creature::SetDisableGravity(), Player::SetDisableGravity(), Player::SetFeatherFall(), Creature::SetFeatherFall(), Player::SetHover(), SetSpeed(), Player::SetWaterWalking(), and Creature::SetWaterWalking().

◆ BuildValuesUpdate()

void Unit::BuildValuesUpdate ( uint8  updateType,
ByteBuffer data,
Player target 
)
overrideprotectedvirtual

Reimplemented from Object.

20712{
20713 if (!target)
20714 return;
20715
20717 uint32 visibleFlag = UF_FLAG_PUBLIC;
20718
20719 if (target == this)
20720 visibleFlag |= UF_FLAG_PRIVATE;
20721
20723 if (GetOwnerGUID() == target->GetGUID())
20724 visibleFlag |= UF_FLAG_OWNER;
20725
20728 visibleFlag |= UF_FLAG_SPECIAL_INFO;
20729
20730 if (plr && plr->IsInSameRaidWith(target))
20731 visibleFlag |= UF_FLAG_PARTY_MEMBER;
20732
20733 uint64 cacheKey = static_cast<uint64>(visibleFlag) << 8 | updateType;
20734
20735 auto cacheIt = _valuesUpdateCache.find(cacheKey);
20736 if (cacheIt != _valuesUpdateCache.end())
20737 {
20738 int32 cachePos = static_cast<int32>(data->wpos());
20739 data->append(cacheIt->second.buffer);
20740
20741 BuildValuesCachePosPointers dataAdjustedPos = cacheIt->second.posPointers;
20742 if (cachePos)
20743 dataAdjustedPos.ApplyOffset(cachePos);
20744
20745 PatchValuesUpdate(*data, dataAdjustedPos, target);
20746
20747 return;
20748 }
20749
20750 BuildValuesCachedBuffer cacheValue(500);
20751
20752 ByteBuffer fieldBuffer(400);
20753
20754 UpdateMask updateMask;
20755 updateMask.SetCount(m_valuesCount);
20756
20757 for (uint16 index = 0; index < m_valuesCount; ++index)
20758 {
20759 if (_fieldNotifyFlags & flags[index] ||
20760 ((flags[index] & visibleFlag) & UF_FLAG_SPECIAL_INFO) ||
20761 ((updateType == UPDATETYPE_VALUES ? _changesMask.GetBit(index) : m_uint32Values[index]) && (flags[index] & visibleFlag)) ||
20763 {
20764 updateMask.SetBit(index);
20765
20766 if (index == UNIT_NPC_FLAGS)
20767 {
20768 cacheValue.posPointers.UnitNPCFlagsPos = int32(fieldBuffer.wpos());
20769 fieldBuffer << m_uint32Values[UNIT_NPC_FLAGS];
20770 }
20771 else if (index == UNIT_FIELD_AURASTATE)
20772 {
20773 cacheValue.posPointers.UnitFieldAuraStatePos = int32(fieldBuffer.wpos());
20774 fieldBuffer << uint32(0); // Fill in later.
20775 }
20776 // FIXME: Some values at server stored in float format but must be sent to client in uint32 format
20777 else if (index >= UNIT_FIELD_BASEATTACKTIME && index <= UNIT_FIELD_RANGEDATTACKTIME)
20778 {
20779 // convert from float to uint32 and send
20780 fieldBuffer << uint32(m_floatValues[index] < 0 ? 0 : m_floatValues[index]);
20781 }
20782 // there are some float values which may be negative or can't get negative due to other checks
20783 else if ((index >= UNIT_FIELD_NEGSTAT0 && index <= UNIT_FIELD_NEGSTAT4) ||
20786 (index >= UNIT_FIELD_POSSTAT0 && index <= UNIT_FIELD_POSSTAT4))
20787 {
20788 fieldBuffer << uint32(m_floatValues[index]);
20789 }
20790 // Gamemasters should be always able to select units - remove not selectable flag
20791 else if (index == UNIT_FIELD_FLAGS)
20792 {
20793 cacheValue.posPointers.UnitFieldFlagsPos = int32(fieldBuffer.wpos());
20794 fieldBuffer << m_uint32Values[UNIT_FIELD_FLAGS];
20795 }
20796 // use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures
20797 else if (index == UNIT_FIELD_DISPLAYID)
20798 {
20799 cacheValue.posPointers.UnitFieldDisplayPos = int32(fieldBuffer.wpos());
20800 fieldBuffer << m_uint32Values[UNIT_FIELD_DISPLAYID];
20801 }
20802 else if (index == UNIT_DYNAMIC_FLAGS)
20803 {
20804 cacheValue.posPointers.UnitDynamicFlagsPos = int32(fieldBuffer.wpos());
20806 fieldBuffer << dynamicFlags;
20807 }
20808 else if (index == UNIT_FIELD_BYTES_2)
20809 {
20810 cacheValue.posPointers.UnitFieldBytes2Pos = int32(fieldBuffer.wpos());
20811 fieldBuffer << m_uint32Values[index];
20812 }
20813 else if (index == UNIT_FIELD_FACTIONTEMPLATE)
20814 {
20815 cacheValue.posPointers.UnitFieldFactionTemplatePos = int32(fieldBuffer.wpos());
20816 fieldBuffer << m_uint32Values[index];
20817 }
20818 else
20819 {
20820 if (sScriptMgr->ShouldTrackValuesUpdatePosByIndex(this, updateType, index))
20821 cacheValue.posPointers.other[index] = static_cast<uint32>(fieldBuffer.wpos());
20822
20823 // send in current format (float as float, uint32 as uint32)
20824 fieldBuffer << m_uint32Values[index];
20825 }
20826 }
20827 }
20828
20829 cacheValue.buffer << uint8(updateMask.GetBlockCount());
20830 updateMask.AppendToPacket(&cacheValue.buffer);
20831 int32 fieldBufferPos = static_cast<int32>(cacheValue.buffer.wpos());
20832 cacheValue.buffer.append(fieldBuffer);
20833 cacheValue.posPointers.ApplyOffset(fieldBufferPos);
20834
20835 int32 cachePos = static_cast<int32>(data->wpos());
20836 data->append(cacheValue.buffer);
20837
20838 BuildValuesCachePosPointers dataAdjustedPos = cacheValue.posPointers;
20839 if (cachePos)
20840 dataAdjustedPos.ApplyOffset(cachePos);
20841
20842 PatchValuesUpdate(*data, dataAdjustedPos, target);
20843
20844 _valuesUpdateCache.insert(std::pair<uint64, BuildValuesCachedBuffer>(cacheKey, std::move(cacheValue)));
20845}
std::uint64_t uint64
Definition: Define.h:106
@ UNIT_DYNFLAG_SPECIALINFO
Definition: SharedDefines.h:3125
@ UNIT_DYNFLAG_TAPPED_BY_PLAYER
Definition: SharedDefines.h:3124
@ UNIT_DYNFLAG_TAPPED
Definition: SharedDefines.h:3123
@ SPELL_AURA_EMPATHY
Definition: SpellAuraDefines.h:184
@ UF_FLAG_SPECIAL_INFO
Definition: UpdateFieldFlags.h:32
@ UF_FLAG_PUBLIC
Definition: UpdateFieldFlags.h:27
@ UF_FLAG_OWNER
Definition: UpdateFieldFlags.h:29
@ UF_FLAG_PRIVATE
Definition: UpdateFieldFlags.h:28
@ UF_FLAG_PARTY_MEMBER
Definition: UpdateFieldFlags.h:33
uint32 UnitUpdateFieldFlags[PLAYER_END]
Definition: UpdateFieldFlags.cpp:162
@ UNIT_NPC_FLAGS
Definition: UpdateFields.h:139
@ UNIT_FIELD_RANGEDATTACKTIME
Definition: UpdateFields.h:121
@ UNIT_FIELD_DISPLAYID
Definition: UpdateFields.h:124
@ UNIT_FIELD_FACTIONTEMPLATE
Definition: UpdateFields.h:115
@ UNIT_FIELD_POSSTAT4
Definition: UpdateFields.h:150
@ UNIT_FIELD_NEGSTAT4
Definition: UpdateFields.h:155
@ UNIT_FIELD_FLAGS
Definition: UpdateFields.h:117
@ UNIT_DYNAMIC_FLAGS
Definition: UpdateFields.h:136
@ UPDATETYPE_VALUES
Definition: UpdateData.h:28
uint16 _fieldNotifyFlags
Definition: Object.h:256
bool HasDynamicFlag(uint32 flag) const
Definition: Object.h:119
UpdateMask _changesMask
Definition: Object.h:252
uint32 * m_uint32Values
Definition: Object.h:248
uint16 m_valuesCount
Definition: Object.h:254
float * m_floatValues
Definition: Object.h:249
Definition: UpdateMask.h:25
uint32 GetBlockCount() const
Definition: UpdateMask.h:62
bool GetBit(uint32 index) const
Definition: UpdateMask.h:47
void SetCount(uint32 valuesCount)
Definition: UpdateMask.h:65
void SetBit(uint32 index)
Definition: UpdateMask.h:45
void AppendToPacket(ByteBuffer *data)
Definition: UpdateMask.h:49
bool IsInSameRaidWith(Player const *p) const
Definition: Player.h:1869
ValuesUpdateCache _valuesUpdateCache
Definition: Unit.h:2127
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
Definition: Unit.cpp:10616
bool HasAuraTypeWithCaster(AuraType auratype, ObjectGuid caster) const
Definition: Unit.cpp:5710
ObjectGuid GetOwnerGUID() const
Definition: Unit.h:678
void PatchValuesUpdate(ByteBuffer &valuesUpdateBuf, BuildValuesCachePosPointers &posPointers, Player *target)
Definition: Unit.cpp:20847
Definition: UnitUtils.h:65
void ApplyOffset(uint32 offset)
Definition: UnitUtils.h:70
Definition: UnitUtils.h:110
Definition: ByteBuffer.h:70
void append(T value)
Definition: ByteBuffer.h:129
std::size_t wpos() const
Definition: ByteBuffer.h:330

References Object::_changesMask, Object::_fieldNotifyFlags, _valuesUpdateCache, ByteBuffer::append(), UpdateMask::AppendToPacket(), BuildValuesCachePosPointers::ApplyOffset(), BuildValuesCachedBuffer::buffer, UpdateMask::GetBit(), UpdateMask::GetBlockCount(), GetCharmerOrOwnerPlayerOrPlayerItself(), Object::GetGUID(), GetOwnerGUID(), HasAuraTypeWithCaster(), Object::HasDynamicFlag(), Object::HasFlag(), Player::IsInSameRaidWith(), Object::m_floatValues, Object::m_uint32Values, Object::m_valuesCount, BuildValuesCachePosPointers::other, PatchValuesUpdate(), PER_CASTER_AURA_STATE_MASK, BuildValuesCachedBuffer::posPointers, UpdateMask::SetBit(), UpdateMask::SetCount(), SPELL_AURA_EMPATHY, sScriptMgr, UF_FLAG_OWNER, UF_FLAG_PARTY_MEMBER, UF_FLAG_PRIVATE, UF_FLAG_PUBLIC, UF_FLAG_SPECIAL_INFO, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_SPECIALINFO, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, UNIT_FIELD_AURASTATE, UNIT_FIELD_BASEATTACKTIME, UNIT_FIELD_BYTES_2, UNIT_FIELD_DISPLAYID, UNIT_FIELD_FACTIONTEMPLATE, UNIT_FIELD_FLAGS, UNIT_FIELD_NEGSTAT0, UNIT_FIELD_NEGSTAT4, UNIT_FIELD_POSSTAT0, UNIT_FIELD_POSSTAT4, UNIT_FIELD_RANGEDATTACKTIME, UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE, UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE, UNIT_NPC_FLAGS, BuildValuesCachePosPointers::UnitDynamicFlagsPos, BuildValuesCachePosPointers::UnitFieldAuraStatePos, BuildValuesCachePosPointers::UnitFieldBytes2Pos, BuildValuesCachePosPointers::UnitFieldDisplayPos, BuildValuesCachePosPointers::UnitFieldFactionTemplatePos, BuildValuesCachePosPointers::UnitFieldFlagsPos, BuildValuesCachePosPointers::UnitNPCFlagsPos, UnitUpdateFieldFlags, UPDATETYPE_VALUES, and ByteBuffer::wpos().

◆ CalcAbsorbResist()

void Unit::CalcAbsorbResist ( DamageInfo dmgInfo,
bool  Splited = false 
)
static
2148{
2149 Unit* victim = dmgInfo.GetVictim();
2150 Unit* attacker = dmgInfo.GetAttacker();
2151 uint32 damage = dmgInfo.GetDamage();
2152 SpellSchoolMask schoolMask = dmgInfo.GetSchoolMask();
2153 SpellInfo const* spellInfo = dmgInfo.GetSpellInfo();
2154
2155 if (!victim || !victim->IsAlive() || !damage)
2156 return;
2157
2158 // Magic damage, check for resists
2159 // Ignore spells that cant be resisted
2160 // Xinef: holy resistance exists for npcs
2161 if (!(schoolMask & SPELL_SCHOOL_MASK_NORMAL) && (!(schoolMask & SPELL_SCHOOL_MASK_HOLY) || victim->IsCreature()) && (!spellInfo || (!spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))))
2162 {
2163 float averageResist = Unit::GetEffectiveResistChance(attacker, schoolMask, victim);
2164
2165 float discreteResistProbability[11];
2166 for (uint32 i = 0; i < 11; ++i)
2167 {
2168 discreteResistProbability[i] = 0.5f - 2.5f * std::fabs(0.1f * i - averageResist);
2169 if (discreteResistProbability[i] < 0.0f)
2170 discreteResistProbability[i] = 0.0f;
2171 }
2172
2173 if (averageResist <= 0.1f)
2174 {
2175 discreteResistProbability[0] = 1.0f - 7.5f * averageResist;
2176 discreteResistProbability[1] = 5.0f * averageResist;
2177 discreteResistProbability[2] = 2.5f * averageResist;
2178 }
2179
2180 float r = float(rand_norm());
2181 uint32 i = 0;
2182 float probabilitySum = discreteResistProbability[0];
2183
2184 while (r >= probabilitySum && i < 10)
2185 probabilitySum += discreteResistProbability[++i];
2186
2187 float damageResisted = float(damage * i / 10);
2188
2189 if (damageResisted) // if equal to 0, checking these is pointless
2190 {
2191 if (attacker)
2192 {
2194 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2195 if (((*j)->GetMiscValue() & schoolMask) && (*j)->IsAffectedOnSpell(spellInfo))
2196 AddPct(damageResisted, -(*j)->GetAmount());
2197
2199 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2200 if ((*j)->GetMiscValue() & schoolMask)
2201 AddPct(damageResisted, -(*j)->GetAmount());
2202 }
2203
2204 // pussywizard:
2205 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC))
2206 {
2207 uint32 damageAfterArmor = Unit::CalcArmorReducedDamage(attacker, victim, damage, spellInfo, 0, BASE_ATTACK);
2208 uint32 armorReduction = damage - damageAfterArmor;
2209 if (armorReduction < damageResisted) // pick the lower one, the weakest resistance counts
2210 damageResisted = armorReduction;
2211 }
2212 }
2213
2214 dmgInfo.ResistDamage(uint32(damageResisted));
2215 }
2216
2217 // Ignore Absorption Auras
2218 float auraAbsorbMod = 0;
2219 if (attacker)
2220 {
2222 for (AuraEffectList::const_iterator itr = AbsIgnoreAurasA.begin(); itr != AbsIgnoreAurasA.end(); ++itr)
2223 {
2224 if (!((*itr)->GetMiscValue() & schoolMask))
2225 continue;
2226
2227 if ((*itr)->GetAmount() > auraAbsorbMod)
2228 auraAbsorbMod = float((*itr)->GetAmount());
2229 }
2230
2232 for (AuraEffectList::const_iterator itr = AbsIgnoreAurasB.begin(); itr != AbsIgnoreAurasB.end(); ++itr)
2233 {
2234 if (!((*itr)->GetMiscValue() & schoolMask))
2235 continue;
2236
2237 if (((*itr)->GetAmount() > auraAbsorbMod) && (*itr)->IsAffectedOnSpell(spellInfo))
2238 auraAbsorbMod = float((*itr)->GetAmount());
2239 }
2240 RoundToInterval(auraAbsorbMod, 0.0f, 100.0f);
2241 }
2242
2243 // We're going to call functions which can modify content of the list during iteration over it's elements
2244 // Let's copy the list so we can prevent iterator invalidation
2246 vSchoolAbsorbCopy.sort(Acore::AbsorbAuraOrderPred());
2247
2248 // absorb without mana cost
2249 for (AuraEffectList::iterator itr = vSchoolAbsorbCopy.begin(); (itr != vSchoolAbsorbCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2250 {
2251 AuraEffect* absorbAurEff = *itr;
2252 // Check if aura was removed during iteration - we don't need to work on such auras
2253 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2254 if (!aurApp)
2255 continue;
2256 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2257 continue;
2258
2259 // get amount which can be still absorbed by the aura
2260 int32 currentAbsorb = absorbAurEff->GetAmount();
2261 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2262 if (currentAbsorb < 0)
2263 currentAbsorb = 0;
2264
2265 uint32 tempAbsorb = uint32(currentAbsorb);
2266
2267 bool defaultPrevented = false;
2268
2269 absorbAurEff->GetBase()->CallScriptEffectAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2270 currentAbsorb = tempAbsorb;
2271
2272 if (defaultPrevented)
2273 continue;
2274
2275 // absorb must be smaller than the damage itself
2276 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2277
2278 // xinef: do this after absorb is rounded to damage...
2279 AddPct(currentAbsorb, -auraAbsorbMod);
2280
2281 dmgInfo.AbsorbDamage(currentAbsorb);
2282
2283 tempAbsorb = currentAbsorb;
2284 absorbAurEff->GetBase()->CallScriptEffectAfterAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2285
2286 // Check if our aura is using amount to count damage
2287 if (absorbAurEff->GetAmount() >= 0)
2288 {
2289 // Reduce shield amount
2290 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2291 // Aura cannot absorb anything more - remove it
2292 if (absorbAurEff->GetAmount() <= 0)
2293 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2294 }
2295 }
2296
2297 // absorb by mana cost
2299 for (AuraEffectList::const_iterator itr = vManaShieldCopy.begin(); (itr != vManaShieldCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2300 {
2301 AuraEffect* absorbAurEff = *itr;
2302 // Check if aura was removed during iteration - we don't need to work on such auras
2303 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2304 if (!aurApp)
2305 continue;
2306 // check damage school mask
2307 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2308 continue;
2309
2310 // get amount which can be still absorbed by the aura
2311 int32 currentAbsorb = absorbAurEff->GetAmount();
2312 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2313 if (currentAbsorb < 0)
2314 currentAbsorb = 0;
2315
2316 uint32 tempAbsorb = currentAbsorb;
2317
2318 bool defaultPrevented = false;
2319
2320 absorbAurEff->GetBase()->CallScriptEffectManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2321 currentAbsorb = tempAbsorb;
2322
2323 if (defaultPrevented)
2324 continue;
2325
2326 // absorb must be smaller than the damage itself
2327 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2328
2329 // xinef: do this after absorb is rounded to damage...
2330 AddPct(currentAbsorb, -auraAbsorbMod);
2331
2332 int32 manaReduction = currentAbsorb;
2333
2334 // lower absorb amount by talents
2335 if (float manaMultiplier = absorbAurEff->GetSpellInfo()->Effects[absorbAurEff->GetEffIndex()].CalcValueMultiplier(absorbAurEff->GetCaster()))
2336 manaReduction = int32(float(manaReduction) * manaMultiplier);
2337
2338 int32 manaTaken = -victim->ModifyPower(POWER_MANA, -manaReduction);
2339
2340 // take case when mana has ended up into account
2341 currentAbsorb = currentAbsorb ? int32(float(currentAbsorb) * (float(manaTaken) / float(manaReduction))) : 0;
2342
2343 dmgInfo.AbsorbDamage(currentAbsorb);
2344
2345 tempAbsorb = currentAbsorb;
2346 absorbAurEff->GetBase()->CallScriptEffectAfterManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2347
2348 // Check if our aura is using amount to count damage
2349 if (absorbAurEff->GetAmount() >= 0)
2350 {
2351 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2352 if ((absorbAurEff->GetAmount() <= 0))
2353 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2354 }
2355 }
2356
2357 // split damage auras - only when not damaging self
2358 // Xinef: not true - Warlock Hellfire
2359 if (/*victim != attacker &&*/ !Splited)
2360 {
2361 // We're going to call functions which can modify content of the list during iteration over it's elements
2362 // Let's copy the list so we can prevent iterator invalidation
2363 AuraEffectList vSplitDamageFlatCopy(victim->GetAuraEffectsByType(SPELL_AURA_SPLIT_DAMAGE_FLAT)); // Not used by any spell
2364 for (AuraEffectList::iterator itr = vSplitDamageFlatCopy.begin(); (itr != vSplitDamageFlatCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2365 {
2366 // Check if aura was removed during iteration - we don't need to work on such auras
2367 if (!((*itr)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
2368 continue;
2369 // check damage school mask
2370 if (!((*itr)->GetMiscValue() & schoolMask))
2371 continue;
2372
2373 // Damage can be splitted only if aura has an alive caster
2374 Unit* caster = (*itr)->GetCaster();
2375 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2376 continue;
2377
2378 // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it)
2379 // Ignore LOS attribute is only used for the cast portion of the spell
2380 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2381 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect())
2382 if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2383 continue;
2384
2385 int32 splitDamage = (*itr)->GetAmount();
2386
2387 // absorb must be smaller than the damage itself
2388 splitDamage = RoundToInterval(splitDamage, 0, int32(dmgInfo.GetDamage()));
2389
2390 dmgInfo.AbsorbDamage(splitDamage);
2391
2392 uint32 splitted = splitDamage;
2393 uint32 splitted_absorb = 0;
2394 uint32 splitted_resist = 0;
2395
2396 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2397 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, schoolMask, dmgInfo.GetDamageType());
2398 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2399 {
2400 procEx |= PROC_EX_IMMUNE;
2401 splittedDmgInfo.AbsorbDamage(splitted);
2402 }
2403 else
2404 {
2405 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2406 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2407 }
2408
2409 splitted_absorb = splittedDmgInfo.GetAbsorb();
2410 splitted_resist = splittedDmgInfo.GetResist();
2411 splitted = splittedDmgInfo.GetDamage();
2412
2413 // create procs
2414 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2415 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted, nullptr, -1, nullptr, &splittedDmgInfo);
2416
2417 if (attacker)
2418 {
2419 attacker->SendSpellNonMeleeDamageLog(caster, (*itr)->GetSpellInfo(), splitted, schoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2420 }
2421
2422 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2423 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, schoolMask, (*itr)->GetSpellInfo(), false);
2424 }
2425
2426 // We're going to call functions which can modify content of the list during iteration over it's elements
2427 // Let's copy the list so we can prevent iterator invalidation
2429 for (AuraEffectList::iterator itr = vSplitDamagePctCopy.begin(), next; (itr != vSplitDamagePctCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2430 {
2431 // Check if aura was removed during iteration - we don't need to work on such auras
2432 AuraApplication const* aurApp = (*itr)->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2433 if (!aurApp)
2434 continue;
2435
2436 // check damage school mask
2437 if (!((*itr)->GetMiscValue() & schoolMask))
2438 continue;
2439
2440 // Damage can be splitted only if aura has an alive caster
2441 Unit* caster = (*itr)->GetCaster();
2442 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2443 continue;
2444
2445 // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it)
2446 // Ignore LOS attribute is only used for the cast portion of the spell
2447 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2448 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect())
2449 if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2450 continue;
2451
2452 uint32 splitDamage = CalculatePct(dmgInfo.GetDamage(), (*itr)->GetAmount());
2453 SpellSchoolMask splitSchoolMask = schoolMask;
2454
2455 (*itr)->GetBase()->CallScriptEffectSplitHandlers(*itr, aurApp, dmgInfo, splitDamage);
2456
2457 // absorb must be smaller than the damage itself
2458 splitDamage = RoundToInterval(splitDamage, uint32(0), uint32(dmgInfo.GetDamage()));
2459
2460 // Roar of Sacrifice, dont absorb it
2461 if (splitSpellInfo->Id != 53480)
2462 dmgInfo.AbsorbDamage(splitDamage);
2463 else
2464 splitSchoolMask = SPELL_SCHOOL_MASK_NATURE;
2465
2466 uint32 splitted = splitDamage;
2467 uint32 splitted_absorb = 0;
2468 uint32 splitted_resist = 0;
2469
2470 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2471 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, splitSchoolMask, dmgInfo.GetDamageType());
2472 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2473 {
2474 procEx |= PROC_EX_IMMUNE;
2475 splittedDmgInfo.AbsorbDamage(splitted);
2476 }
2477 else
2478 {
2479 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2480 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2481 }
2482
2483 splitted_absorb = splittedDmgInfo.GetAbsorb();
2484 splitted_resist = splittedDmgInfo.GetResist();
2485 splitted = splittedDmgInfo.GetDamage();
2486
2487 // create procs
2488 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2489 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted);
2490
2491 if (attacker)
2492 {
2493 attacker->SendSpellNonMeleeDamageLog(caster, splitSpellInfo, splitted, splitSchoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2494 }
2495
2496 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2497 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, splitSchoolMask, splitSpellInfo, false);
2498 }
2499 }
2500}
double rand_norm()
Definition: Random.cpp:77
T AddPct(T &base, U pct)
Definition: Util.h:67
T RoundToInterval(T &num, T floor, T ceil)
Definition: Util.h:79
@ POWER_MANA
Definition: SharedDefines.h:269
@ SPELL_ATTR4_NO_CAST_LOG
Definition: SharedDefines.h:530
SpellSchoolMask
Definition: SharedDefines.h:295
@ SPELL_SCHOOL_MASK_NORMAL
Definition: SharedDefines.h:297
@ SPELL_SCHOOL_MASK_NATURE
Definition: SharedDefines.h:300
@ SPELL_SCHOOL_MASK_HOLY
Definition: SharedDefines.h:298
@ SPELL_ATTR0_CU_BINARY_SPELL
Definition: SpellInfo.h:196
@ SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC
Definition: SpellInfo.h:199
@ SPELL_AURA_MANA_SHIELD
Definition: SpellAuraDefines.h:160
@ SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL
Definition: SpellAuraDefines.h:257
@ SPELL_AURA_MOD_IGNORE_TARGET_RESIST
Definition: SpellAuraDefines.h:332
@ SPELL_AURA_SPLIT_DAMAGE_FLAT
Definition: SpellAuraDefines.h:216
@ SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL
Definition: SpellAuraDefines.h:258
@ SPELL_AURA_SPLIT_DAMAGE_PCT
Definition: SpellAuraDefines.h:144
@ SPELL_AURA_SCHOOL_ABSORB
Definition: SpellAuraDefines.h:132
@ SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST
Definition: SpellAuraDefines.h:333
@ AURA_REMOVE_BY_ENEMY_SPELL
Definition: SpellAuraDefines.h:394
@ PROC_EX_NORMAL_HIT
Definition: SpellMgr.h:194
@ PROC_EX_IMMUNE
Definition: SpellMgr.h:202
void createProcFlags(SpellInfo const *spellInfo, WeaponAttackType attackType, bool positive, uint32 &procAttacker, uint32 &procVictim)
Definition: Unit.cpp:15921
@ DIRECT_DAMAGE
Definition: Unit.h:248
@ MELEE_HIT_NORMAL
Definition: Unit.h:286
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition: Object.cpp:1316
Definition: Unit.h:315
void ResistDamage(uint32 amount)
Definition: Unit.cpp:158
void AbsorbDamage(uint32 amount)
Definition: Unit.cpp:151
Unit * GetVictim() const
Definition: Unit.h:359
Unit * GetAttacker() const
Definition: Unit.h:358
SpellInfo const * GetSpellInfo() const
Definition: Unit.h:360
DamageEffectType GetDamageType() const
Definition: Unit.h:362
SpellSchoolMask GetSchoolMask() const
Definition: Unit.h:361
uint32 GetDamage() const
Definition: Unit.h:364
int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition: Unit.cpp:14149
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition: Unit.h:1349
static uint32 CalcArmorReducedDamage(Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
Definition: Unit.cpp:2031
static float GetEffectiveResistChance(Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
Definition: Unit.cpp:2113
void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage *log)
Definition: Unit.cpp:6310
void ProcDamageAndSpellFor(bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
Definition: Unit.cpp:16055
std::list< AuraEffect * > AuraEffectList
Definition: Unit.h:646
bool IsImmunedToDamageOrSchool(SpellSchoolMask meleeSchoolMask) const
Definition: Unit.cpp:12901
static void CalcAbsorbResist(DamageInfo &dmgInfo, bool Splited=false)
Definition: Unit.cpp:2147
static uint32 DealDamage(Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
Definition: Unit.cpp:810
Definition: SpellAuraEffects.h:39
SpellInfo const * GetSpellInfo() const
Definition: SpellAuraEffects.h:54
void SetAmount(int32 amount)
Definition: SpellAuraEffects.h:66
Unit * GetCaster() const
Definition: SpellAuraEffects.h:47
int32 GetMiscValue() const
Definition: SpellAuraEffects.cpp:442
Aura * GetBase() const
Definition: SpellAuraEffects.h:49
uint32 GetEffIndex() const
Definition: SpellAuraEffects.h:56
int32 GetAmount() const
Definition: SpellAuraEffects.h:64
Definition: SpellAuraEffects.h:349
void CallScriptEffectAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition: SpellAuras.cpp:2559
void CallScriptEffectAfterAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition: SpellAuras.cpp:2577
void CallScriptEffectManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition: SpellAuras.cpp:2591
void CallScriptEffectAfterManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition: SpellAuras.cpp:2605
virtual void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)=0
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > Effects
Definition: SpellInfo.h:393
float GetMaxRange(bool positive=false, Unit *caster=nullptr, Spell *spell=nullptr) const
Definition: SpellInfo.cpp:2323
bool IsPositive() const
Definition: SpellInfo.cpp:1237

References DamageInfo::AbsorbDamage(), AddPct(), AURA_REMOVE_BY_ENEMY_SPELL, BASE_ATTACK, CalcAbsorbResist(), CalcArmorReducedDamage(), CalculatePct(), Aura::CallScriptEffectAbsorbHandlers(), Aura::CallScriptEffectAfterAbsorbHandlers(), Aura::CallScriptEffectAfterManaShieldHandlers(), Aura::CallScriptEffectManaShieldHandlers(), createProcFlags(), DealDamage(), DealDamageMods(), DIRECT_DAMAGE, SpellInfo::Effects, DamageInfo::GetAbsorb(), AuraEffect::GetAmount(), Aura::GetApplicationOfTarget(), DamageInfo::GetAttacker(), GetAuraEffectsByType(), AuraEffect::GetBase(), AuraApplication::GetBase(), AuraEffect::GetCaster(), DamageInfo::GetDamage(), DamageInfo::GetDamageType(), GetEffectiveResistChance(), AuraEffect::GetEffIndex(), Object::GetGUID(), SpellInfo::GetMaxRange(), AuraEffect::GetMiscValue(), DamageInfo::GetResist(), DamageInfo::GetSchoolMask(), DamageInfo::GetSpellInfo(), AuraEffect::GetSpellInfo(), DamageInfo::GetVictim(), SpellInfo::HasAttribute(), SpellInfo::Id, IsAlive(), Object::IsCreature(), IsImmunedToDamageOrSchool(), Object::IsInWorld(), SpellInfo::IsPositive(), WorldObject::IsWithinDist(), MELEE_HIT_NORMAL, ModifyPower(), POWER_MANA, PROC_EX_IMMUNE, PROC_EX_NORMAL_HIT, ProcDamageAndSpellFor(), rand_norm(), Aura::Remove(), DamageInfo::ResistDamage(), RoundToInterval(), SendSpellNonMeleeDamageLog(), AuraEffect::SetAmount(), SPELL_ATTR0_CU_BINARY_SPELL, SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC, SPELL_ATTR4_NO_CAST_LOG, SPELL_AURA_MANA_SHIELD, SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL, SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL, SPELL_AURA_SCHOOL_ABSORB, SPELL_AURA_SPLIT_DAMAGE_FLAT, SPELL_AURA_SPLIT_DAMAGE_PCT, SPELL_SCHOOL_MASK_HOLY, SPELL_SCHOOL_MASK_NATURE, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by CalcAbsorbResist(), CalculateSpellDamageTaken(), DealDamage(), DealMeleeDamage(), Player::EnvironmentalDamage(), spell_valkyr_touch_aura::HandleEffectPeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ CalcArmorReducedDamage()

uint32 Unit::CalcArmorReducedDamage ( Unit const *  attacker,
Unit const *  victim,
const uint32  damage,
SpellInfo const *  spellInfo,
uint8  attackerLevel = 0,
WeaponAttackType  attackType = MAX_ATTACK 
)
static
2032{
2033 float armor = float(victim->GetArmor());
2034
2035 // Ignore enemy armor by SPELL_AURA_MOD_TARGET_RESISTANCE aura
2036 if (attacker)
2037 {
2038 armor += attacker->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL);
2039
2040 if (spellInfo)
2041 if (Player* modOwner = attacker->GetSpellModOwner())
2042 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_IGNORE_ARMOR, armor);
2043
2044 AuraEffectList const& ResIgnoreAurasAb = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST);
2045 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2046 {
2047 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL
2048 && (*j)->IsAffectedOnSpell(spellInfo))
2049 armor = std::floor(AddPct(armor, -(*j)->GetAmount()));
2050 }
2051
2052 AuraEffectList const& ResIgnoreAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST);
2053 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2054 {
2055 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
2056 armor = std::floor(AddPct(armor, -(*j)->GetAmount()));
2057 }
2058
2059 // Apply Player CR_ARMOR_PENETRATION rating and buffs from stances\specializations etc.
2060 if (attacker->IsPlayer())
2061 {
2062 float bonusPct = 0;
2063 AuraEffectList const& armorPenAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ARMOR_PENETRATION_PCT);
2064 for (AuraEffectList::const_iterator itr = armorPenAuras.begin(); itr != armorPenAuras.end(); ++itr)
2065 {
2066 if ((*itr)->GetSpellInfo()->EquippedItemClass == -1)
2067 {
2068 if (!spellInfo || (*itr)->IsAffectedOnSpell(spellInfo) || (*itr)->GetMiscValue() & spellInfo->GetSchoolMask())
2069 bonusPct += (*itr)->GetAmount();
2070 else if (!(*itr)->GetMiscValue() && !(*itr)->HasSpellClassMask())
2071 bonusPct += (*itr)->GetAmount();
2072 }
2073 else
2074 {
2075 if (attacker->ToPlayer()->HasItemFitToSpellRequirements((*itr)->GetSpellInfo()))
2076 bonusPct += (*itr)->GetAmount();
2077 }
2078 }
2079
2080 float maxArmorPen = 0;
2081 if (victim->GetLevel() < 60)
2082 maxArmorPen = float(400 + 85 * victim->GetLevel());
2083 else
2084 maxArmorPen = 400 + 85 * victim->GetLevel() + 4.5f * 85 * (victim->GetLevel() - 59);
2085
2086 // Cap armor penetration to this number
2087 maxArmorPen = std::min((armor + maxArmorPen) / 3, armor);
2088 // Figure out how much armor do we ignore
2089 float armorPen = CalculatePct(maxArmorPen, bonusPct + attacker->ToPlayer()->GetRatingBonusValue(CR_ARMOR_PENETRATION));
2090 // Got the value, apply it
2091 armor -= std::min(armorPen, maxArmorPen);
2092 }
2093 }
2094
2095 if (armor < 0.0f)
2096 armor = 0.0f;
2097
2098 float levelModifier = attacker ? attacker->GetLevel() : attackerLevel;
2099 if (levelModifier > 59)
2100 levelModifier = levelModifier + (4.5f * (levelModifier - 59));
2101
2102 float tmpvalue = 0.1f * armor / (8.5f * levelModifier + 40);
2103 tmpvalue = tmpvalue / (1.0f + tmpvalue);
2104
2105 if (tmpvalue < 0.0f)
2106 tmpvalue = 0.0f;
2107 if (tmpvalue > 0.75f)
2108 tmpvalue = 0.75f;
2109
2110 return uint32(std::ceil(std::max(damage * (1.0f - tmpvalue), 0.0f)));
2111}
@ SPELLMOD_IGNORE_ARMOR
Definition: SpellDefines.h:89
@ SPELL_AURA_MOD_ARMOR_PENETRATION_PCT
Definition: SpellAuraDefines.h:343
@ SPELL_AURA_MOD_TARGET_RESISTANCE
Definition: SpellAuraDefines.h:186
@ CR_ARMOR_PENETRATION
Definition: Unit.h:241

References AddPct(), CalculatePct(), CR_ARMOR_PENETRATION, GetArmor(), GetAuraEffectsByType(), GetLevel(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), Player::HasItemFitToSpellRequirements(), SpellInfo::Id, Object::IsPlayer(), SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_ARMOR_PENETRATION_PCT, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL, SPELLMOD_IGNORE_ARMOR, and Object::ToPlayer().

Referenced by CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), boss_priestess_lackey_commonAI::GetThreatMod(), boss_faction_championsAI::GetThreatMod(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ CalcHealAbsorb()

void Unit::CalcHealAbsorb ( HealInfo healInfo)
static
2503{
2504 if (!healInfo.GetHeal())
2505 return;
2506
2507 int32 const healing = static_cast<int32>(healInfo.GetHeal());
2508 int32 absorbAmount = 0;
2509
2510 // Need remove expired auras after
2511 bool existExpired = false;
2512
2513 // absorb without mana cost
2515 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end() && absorbAmount <= healing; ++i)
2516 {
2517 if (!((*i)->GetMiscValue() & healInfo.GetSpellInfo()->SchoolMask))
2518 continue;
2519
2520 // Max Amount can be absorbed by this aura
2521 int32 currentAbsorb = (*i)->GetAmount();
2522
2523 // Found empty aura (impossible but..)
2524 if (currentAbsorb <= 0)
2525 {
2526 existExpired = true;
2527 continue;
2528 }
2529
2530 // currentAbsorb - damage can be absorbed by shield
2531 // If need absorb less damage
2532 if (healing < currentAbsorb + absorbAmount)
2533 currentAbsorb = healing - absorbAmount;
2534
2535 absorbAmount += currentAbsorb;
2536
2537 // Reduce shield amount
2538 (*i)->SetAmount((*i)->GetAmount() - currentAbsorb);
2539 // Need remove it later
2540 if ((*i)->GetAmount() <= 0)
2541 existExpired = true;
2542 }
2543
2544 // Remove all expired absorb auras
2545 if (existExpired)
2546 {
2547 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end();)
2548 {
2549 AuraEffect* auraEff = *i;
2550 ++i;
2551 if (auraEff->GetAmount() <= 0)
2552 {
2553 uint32 removedAuras = healInfo.GetTarget()->m_removedAurasCount;
2555 if (removedAuras + 1 < healInfo.GetTarget()->m_removedAurasCount)
2556 i = vHealAbsorb.begin();
2557 }
2558 }
2559 }
2560
2561 if (absorbAmount > 0)
2562 healInfo.AbsorbHeal(absorbAmount);
2563}
@ SPELL_AURA_SCHOOL_HEAL_ABSORB
Definition: SpellAuraDefines.h:364
SpellInfo const * GetSpellInfo() const
Definition: Unit.h:415
void AbsorbHeal(uint32 amount)
Definition: Unit.h:390
Unit * GetTarget() const
Definition: Unit.h:411
uint32 GetHeal() const
Definition: Unit.h:412
uint32 SchoolMask
Definition: SpellInfo.h:392

References HealInfo::AbsorbHeal(), AURA_REMOVE_BY_ENEMY_SPELL, AuraEffect::GetAmount(), GetAuraEffectsByType(), AuraEffect::GetBase(), HealInfo::GetHeal(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), m_removedAurasCount, Aura::Remove(), SpellInfo::SchoolMask, and SPELL_AURA_SCHOOL_HEAL_ABSORB.

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), and HealBySpell().

◆ CalcSpellDuration()

int32 Unit::CalcSpellDuration ( SpellInfo const *  spellProto)
14857{
14858 uint8 comboPoints = GetComboPoints();
14859
14860 int32 minduration = spellProto->GetDuration();
14861 int32 maxduration = spellProto->GetMaxDuration();
14862
14863 int32 duration;
14864
14865 if (comboPoints && minduration != -1 && minduration != maxduration)
14866 duration = minduration + int32((maxduration - minduration) * comboPoints / 5);
14867 else
14868 duration = minduration;
14869
14870 return duration;
14871}
uint8 GetComboPoints(Unit const *who=nullptr) const
Definition: Unit.h:958

References GetComboPoints(), SpellInfo::GetDuration(), and SpellInfo::GetMaxDuration().

Referenced by Aura::CalcMaxDuration(), Spell::EffectInterruptCast(), Spell::EffectSchoolDMG(), and Aura::HandleAuraSpecificMods().

◆ CalculateAOEDamageReduction()

int32 Unit::CalculateAOEDamageReduction ( int32  damage,
uint32  schoolMask,
Unit caster 
) const
20396{
20397 damage = int32(float(damage) * GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, schoolMask));
20398 if (caster && caster->IsCreature())
20400
20401 return damage;
20402}
@ SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE
Definition: SpellAuraDefines.h:373
@ SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE
Definition: SpellAuraDefines.h:292
float GetTotalAuraMultiplierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition: Unit.cpp:5974

References GetTotalAuraMultiplierByMiscMask(), Object::IsCreature(), SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, and SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE.

Referenced by Spell::DoAllEffectOnLaunchTarget(), AuraEffect::HandlePeriodicDamageAurasTick(), and spell_dk_death_and_decay::RecalculateDamage().

◆ CalculateDamage()

uint32 Unit::CalculateDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
uint8  itemDamagesMask = 0 
)
2985{
2986 float minDamage = 0.0f;
2987 float maxDamage = 0.0f;
2988
2989 if (normalized || !addTotalPct || itemDamagesMask)
2990 {
2991 // get both by default
2992 if (!itemDamagesMask)
2993 {
2994 itemDamagesMask = (1 << 0) | (1 << 1);
2995 }
2996
2997 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
2998 {
2999 if (itemDamagesMask & (1 << i))
3000 {
3001 float minTmp, maxTmp;
3002 CalculateMinMaxDamage(attType, normalized, addTotalPct, minTmp, maxTmp, i);
3003 minDamage += minTmp;
3004 maxDamage += maxTmp;
3005 }
3006 }
3007 }
3008 else
3009 {
3010 switch (attType)
3011 {
3012 case RANGED_ATTACK:
3015 break;
3016 case BASE_ATTACK:
3019 break;
3020 case OFF_ATTACK:
3023 break;
3024 default:
3025 break;
3026 }
3027 }
3028
3029 minDamage = std::max(0.f, minDamage);
3030 maxDamage = std::max(0.f, maxDamage);
3031
3032 if (minDamage > maxDamage)
3033 {
3034 std::swap(minDamage, maxDamage);
3035 }
3036
3037 return urand(uint32(minDamage), uint32(maxDamage));
3038}
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:44
@ UNIT_FIELD_MINDAMAGE
Definition: UpdateFields.h:127
@ UNIT_FIELD_MAXDAMAGE
Definition: UpdateFields.h:128
@ UNIT_FIELD_MAXOFFHANDDAMAGE
Definition: UpdateFields.h:130
@ UNIT_FIELD_MAXRANGEDDAMAGE
Definition: UpdateFields.h:169
@ UNIT_FIELD_MINRANGEDDAMAGE
Definition: UpdateFields.h:168
@ UNIT_FIELD_MINOFFHANDDAMAGE
Definition: UpdateFields.h:129
virtual void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0

References BASE_ATTACK, CalculateMinMaxDamage(), Object::GetFloatValue(), MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, RANGED_ATTACK, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, UNIT_FIELD_MINRANGEDDAMAGE, and urand().

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ CalculateDefaultCoefficient()

float Unit::CalculateDefaultCoefficient ( SpellInfo const *  spellInfo,
DamageEffectType  damagetype 
) const
17198{
17199 // Damage over Time spells bonus calculation
17200 float DotFactor = 1.0f;
17201 if (damagetype == DOT)
17202 {
17203 int32 DotDuration = spellInfo->GetDuration();
17204 if (!spellInfo->IsChanneled() && DotDuration > 0)
17205 DotFactor = DotDuration / 15000.0f;
17206
17207 if (uint32 DotTicks = spellInfo->GetMaxTicks())
17208 DotFactor /= DotTicks;
17209 }
17210
17211 int32 CastingTime = spellInfo->IsChanneled() ? spellInfo->GetDuration() : spellInfo->CalcCastTime();
17212 // Distribute Damage over multiple effects, reduce by AoE
17213 CastingTime = GetCastingTimeForBonus(spellInfo, damagetype, CastingTime);
17214
17215 // As wowwiki says: C = (Cast Time / 3.5)
17216 return (CastingTime / 3500.0f) * DotFactor;
17217}
@ DOT
Definition: Unit.h:250
uint32 GetCastingTimeForBonus(SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
Definition: Unit.cpp:17079

References SpellInfo::CalcCastTime(), DOT, GetCastingTimeForBonus(), SpellInfo::GetDuration(), SpellInfo::GetMaxTicks(), and SpellInfo::IsChanneled().

Referenced by SpellDamageBonusTaken().

◆ CalculateLevelPenalty()

float Unit::CalculateLevelPenalty ( SpellInfo const *  spellProto) const
3041{
3042 if (!IsPlayer())
3043 return 1.0f;
3044
3045 if (spellProto->SpellLevel <= 0 || spellProto->SpellLevel >= spellProto->MaxLevel)
3046 return 1.0f;
3047
3048 float LvlPenalty = 0.0f;
3049
3050 // xinef: added brackets
3051 if (spellProto->SpellLevel < 20)
3052 LvlPenalty = (20.0f - spellProto->SpellLevel) * 3.75f;
3053
3054 float LvlFactor = (float(spellProto->SpellLevel) + 6.0f) / float(GetLevel());
3055 if (LvlFactor > 1.0f)
3056 LvlFactor = 1.0f;
3057
3058 return AddPct(LvlFactor, -LvlPenalty);
3059}
uint8 GetLevel() const
Definition: Unit.h:1024

References AddPct(), GetLevel(), Object::IsPlayer(), SpellInfo::MaxLevel, and SpellInfo::SpellLevel.

Referenced by spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), CalculateSpellAmount(), SpellDamageBonusDone(), SpellDamageBonusTaken(), and SpellHealingBonusDone().

◆ CalculateMeleeDamage()

void Unit::CalculateMeleeDamage ( Unit victim,
CalcDamageInfo damageInfo,
WeaponAttackType  attackType = BASE_ATTACK,
const bool  sittingVictim = false 
)
1465{
1466 damageInfo->attacker = this;
1467 damageInfo->target = victim;
1468
1469 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1470 {
1471 damageInfo->damages[i].damageSchoolMask = GetMeleeDamageSchoolMask(attackType, i);
1472 damageInfo->damages[i].damage = 0;
1473 damageInfo->damages[i].absorb = 0;
1474 damageInfo->damages[i].resist = 0;
1475 }
1476
1477 damageInfo->attackType = attackType;
1478 damageInfo->cleanDamage = 0;
1479 damageInfo->blocked_amount = 0;
1480
1481 damageInfo->TargetState = 0;
1482 damageInfo->HitInfo = 0;
1483 damageInfo->procAttacker = PROC_FLAG_NONE;
1484 damageInfo->procVictim = PROC_FLAG_NONE;
1485 damageInfo->procEx = PROC_EX_NONE;
1486 damageInfo->hitOutCome = MELEE_HIT_EVADE;
1487
1488 if (!victim)
1489 return;
1490
1491 if (!IsAlive() || !victim->IsAlive())
1492 return;
1493
1494 // Select HitInfo/procAttacker/procVictim flag based on attack type
1495 switch (attackType)
1496 {
1497 case BASE_ATTACK:
1500 break;
1501 case OFF_ATTACK:
1504 damageInfo->HitInfo = HITINFO_OFFHAND;
1505 break;
1506 default:
1507 return;
1508 }
1509
1510 // School Immune check
1511 uint8 immunedMask = 0;
1512 bool hasNonPhysicalSchoolMask = false;
1513 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1514 {
1516 {
1517 immunedMask |= (1 << i);
1519 {
1520 hasNonPhysicalSchoolMask = true;
1521 }
1522 }
1523 }
1524
1525 // School Immune check
1526 if (immunedMask & ((1 << 0) | (1 << 1)))
1527 {
1528 if (hasNonPhysicalSchoolMask || immunedMask == ((1 << 0) | (1 << 1)))
1529 {
1530 damageInfo->HitInfo |= HITINFO_NORMALSWING;
1531 damageInfo->TargetState = VICTIMSTATE_IS_IMMUNE;
1532
1533 damageInfo->procEx |= PROC_EX_IMMUNE;
1534 return;
1535 }
1536 }
1537
1538 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1539 {
1540 // only players have secondary weapon damage
1541 if (i > 0 && !IsPlayer())
1542 {
1543 break;
1544 }
1545
1546 if (immunedMask & (1 << i))
1547 {
1548 continue;
1549 }
1550
1551 SpellSchoolMask schoolMask = SpellSchoolMask(damageInfo->damages[i].damageSchoolMask);
1552 bool const addPctMods = (schoolMask & SPELL_SCHOOL_MASK_NORMAL);
1553
1554 uint32 damage = 0;
1555 uint8 itemDamagesMask = (IsPlayer()) ? (1 << i) : 0;
1556
1557 damage += CalculateDamage(damageInfo->attackType, false, addPctMods, itemDamagesMask);
1558 // Add melee damage bonus
1559 damage = MeleeDamageBonusDone(damageInfo->target, damage, damageInfo->attackType, nullptr, schoolMask);
1560 damage = damageInfo->target->MeleeDamageBonusTaken(this, damage, damageInfo->attackType, nullptr, schoolMask);
1561
1562 // Script Hook For CalculateMeleeDamage -- Allow scripts to change the Damage pre class mitigation calculations
1563 sScriptMgr->ModifyMeleeDamage(damageInfo->target, damageInfo->attacker, damage);
1564
1565 if (victim->GetAI())
1566 {
1567 victim->GetAI()->OnCalculateMeleeDamageReceived(damage, this);
1568 }
1569
1570 // Calculate armor reduction
1572 {
1573 damageInfo->damages[i].damage = Unit::CalcArmorReducedDamage(this, damageInfo->target, damage, nullptr, 0, damageInfo->attackType);
1574 damageInfo->cleanDamage += damage - damageInfo->damages[i].damage;
1575 }
1576 else
1577 {
1578 damageInfo->damages[i].damage = damage;
1579 }
1580 }
1581
1582 damageInfo->hitOutCome = RollMeleeOutcomeAgainst(damageInfo->target, damageInfo->attackType);
1583
1584 // If the victim was a sitting player and we didn't roll a miss, then crit.
1585 if (sittingVictim && damageInfo->hitOutCome != MELEE_HIT_MISS)
1586 {
1587 damageInfo->hitOutCome = MELEE_HIT_CRIT;
1588 }
1589 switch (damageInfo->hitOutCome)
1590 {
1591 case MELEE_HIT_EVADE:
1593 damageInfo->TargetState = VICTIMSTATE_EVADES;
1594 damageInfo->procEx |= PROC_EX_EVADE;
1595
1596 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1597 {
1598 damageInfo->damages[i].damage = 0;
1599 }
1600
1601 damageInfo->cleanDamage = 0;
1602 return;
1603 case MELEE_HIT_MISS:
1604 damageInfo->HitInfo |= HITINFO_MISS;
1605 damageInfo->TargetState = VICTIMSTATE_INTACT;
1606 damageInfo->procEx |= PROC_EX_MISS;
1607
1608 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1609 {
1610 damageInfo->damages[i].damage = 0;
1611 }
1612 damageInfo->cleanDamage = 0;
1613 break;
1614 case MELEE_HIT_NORMAL:
1615 damageInfo->TargetState = VICTIMSTATE_HIT;
1616 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1617 break;
1618 case MELEE_HIT_CRIT:
1619 {
1620 damageInfo->HitInfo |= HITINFO_CRITICALHIT;
1621 damageInfo->TargetState = VICTIMSTATE_HIT;
1622
1623 damageInfo->procEx |= PROC_EX_CRITICAL_HIT;
1624 // Crit bonus calc
1625 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1626 {
1627 damageInfo->damages[i].damage *= 2;
1628
1629 float mod = 0.0f;
1630 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1631 if (damageInfo->attackType == RANGED_ATTACK)
1632 {
1634 }
1635 else
1636 {
1638
1639 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1641 }
1642
1643 uint32 crTypeMask = damageInfo->target->GetCreatureTypeMask();
1644
1645 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1647 if (mod != 0)
1648 {
1649 AddPct(damageInfo->damages[i].damage, mod);
1650 }
1651 }
1652 break;
1653 }
1654 case MELEE_HIT_PARRY:
1655 damageInfo->TargetState = VICTIMSTATE_PARRY;
1656 damageInfo->procEx |= PROC_EX_PARRY;
1657 damageInfo->cleanDamage = 0;
1658
1659 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1660 {
1661 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1662 damageInfo->damages[i].damage = 0;
1663 }
1664 break;
1665 case MELEE_HIT_DODGE:
1666 damageInfo->TargetState = VICTIMSTATE_DODGE;
1667 damageInfo->procEx |= PROC_EX_DODGE;
1668 damageInfo->cleanDamage = 0;
1669
1670 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1671 {
1672 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1673 damageInfo->damages[i].damage = 0;
1674 }
1675 break;
1676 case MELEE_HIT_BLOCK:
1677 {
1678 damageInfo->TargetState = VICTIMSTATE_HIT;
1679 damageInfo->HitInfo |= HITINFO_BLOCK;
1680 damageInfo->procEx |= PROC_EX_BLOCK;
1681 damageInfo->blocked_amount = damageInfo->target->GetShieldBlockValue();
1682 // double blocked amount if block is critical
1683 if (damageInfo->target->isBlockCritical())
1684 damageInfo->blocked_amount += damageInfo->blocked_amount;
1685
1686 uint32 remainingBlock = damageInfo->blocked_amount;
1687 uint8 fullBlockMask = 0;
1688 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1689 {
1690 if (remainingBlock && remainingBlock >= damageInfo->damages[i].damage)
1691 {
1692 fullBlockMask |= (1 << i);
1693
1694 remainingBlock -= damageInfo->damages[i].damage;
1695 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1696 damageInfo->damages[i].damage = 0;
1697 }
1698 else
1699 {
1700 damageInfo->cleanDamage += remainingBlock;
1701 damageInfo->damages[i].damage -= remainingBlock;
1702 remainingBlock = 0;
1703 }
1704 }
1705
1706 // full block
1707 if (fullBlockMask == ((1 << 0) | (1 << 1)))
1708 {
1709 damageInfo->TargetState = VICTIMSTATE_BLOCKS;
1710 damageInfo->procEx |= PROC_EX_FULL_BLOCK;
1711 damageInfo->blocked_amount -= remainingBlock;
1712 }
1713 break;
1714 }
1715 case MELEE_HIT_GLANCING:
1716 {
1717 damageInfo->HitInfo |= HITINFO_GLANCING;
1718 damageInfo->TargetState = VICTIMSTATE_HIT;
1719 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1720 int32 leveldif = int32(victim->GetLevel()) - int32(GetLevel());
1721 if (leveldif > 3)
1722 leveldif = 3;
1723 float reducePercent = 1 - leveldif * 0.1f;
1724
1725 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1726 {
1727 uint32 reducedDamage = uint32(reducePercent * damageInfo->damages[i].damage);
1728 damageInfo->cleanDamage += damageInfo->damages[i].damage - reducedDamage;
1729 damageInfo->damages[i].damage = reducedDamage;
1730 }
1731 break;
1732 }
1733 case MELEE_HIT_CRUSHING:
1734 damageInfo->HitInfo |= HITINFO_CRUSHING;
1735 damageInfo->TargetState = VICTIMSTATE_HIT;
1736 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1737
1738 // 150% normal damage
1739 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1740 {
1741 damageInfo->damages[i].damage += (damageInfo->damages[i].damage / 2);
1742 }
1743 break;
1744 default:
1745 break;
1746 }
1747
1748 // Always apply HITINFO_AFFECTS_VICTIM in case its not a miss
1749 if (!(damageInfo->HitInfo & HITINFO_MISS))
1750 damageInfo->HitInfo |= HITINFO_AFFECTS_VICTIM;
1751
1752 uint32 tmpHitInfo[MAX_ITEM_PROTO_DAMAGES] = { };
1753
1754 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1755 {
1756 int32 dmg = damageInfo->damages[i].damage;
1757 int32 cleanDamage = damageInfo->cleanDamage;
1758 // attackType is checked already for BASE_ATTACK or OFF_ATTACK so it can't be RANGED_ATTACK here
1759 if (CanApplyResilience())
1760 {
1761 int32 resilienceReduction = damageInfo->damages[i].damage;
1762 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, (damageInfo->hitOutCome == MELEE_HIT_CRIT), CR_CRIT_TAKEN_MELEE);
1763
1764 resilienceReduction = damageInfo->damages[i].damage - resilienceReduction;
1765 dmg -= resilienceReduction;
1766 cleanDamage += resilienceReduction;
1767 }
1768
1769 damageInfo->damages[i].damage = std::max(0, dmg);
1770 damageInfo->cleanDamage = std::max(0, cleanDamage);
1771
1772 // Calculate absorb resist
1773 if (damageInfo->damages[i].damage > 0)
1774 {
1775 damageInfo->procVictim |= PROC_FLAG_TAKEN_DAMAGE;
1776
1777 // Calculate absorb & resists
1778 DamageInfo dmgInfo(*damageInfo, i);
1779 Unit::CalcAbsorbResist(dmgInfo);
1780 damageInfo->damages[i].absorb = dmgInfo.GetAbsorb();
1781 damageInfo->damages[i].resist = dmgInfo.GetResist();
1782
1783 if (damageInfo->damages[i].absorb)
1784 {
1785 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].absorb == 0 ? HITINFO_FULL_ABSORB : HITINFO_PARTIAL_ABSORB);
1786 }
1787
1788 if (damageInfo->damages[i].resist)
1789 {
1790 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].resist == 0 ? HITINFO_FULL_RESIST : HITINFO_PARTIAL_RESIST);
1791 }
1792
1793 damageInfo->damages[i].damage = dmgInfo.GetDamage();
1794 }
1795 }
1796
1797 // set proper HitInfo flags
1798 if ((tmpHitInfo[0] & HITINFO_FULL_ABSORB) != 0)
1799 {
1800 // set partial absorb when secondary damage isn't full absorbed
1801 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_ABSORB) != 0) ? HITINFO_PARTIAL_ABSORB : HITINFO_FULL_ABSORB;
1802 }
1803 else
1804 {
1805 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_ABSORB);
1806 }
1807
1808 if ((tmpHitInfo[0] & HITINFO_FULL_RESIST) != 0)
1809 {
1810 // set partial resist when secondary damage isn't full resisted
1811 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_RESIST) != 0) ? HITINFO_PARTIAL_RESIST : HITINFO_FULL_RESIST;
1812 }
1813 else
1814 {
1815 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_RESIST);
1816 }
1817
1819 {
1820 damageInfo->procEx |= PROC_EX_ABSORB;
1821 }
1822
1823 if (damageInfo->HitInfo & HITINFO_FULL_RESIST)
1824 {
1825 damageInfo->procEx |= PROC_EX_RESIST;
1826 }
1827}
@ SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
Definition: SpellAuraDefines.h:232
@ SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE
Definition: SpellAuraDefines.h:267
@ SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
Definition: SpellAuraDefines.h:226
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
Definition: SpellAuraDefines.h:266
@ PROC_EX_NONE
Definition: SpellMgr.h:193
@ PROC_EX_DODGE
Definition: SpellMgr.h:198
@ PROC_EX_BLOCK
Definition: SpellMgr.h:200
@ PROC_EX_CRITICAL_HIT
Definition: SpellMgr.h:195
@ PROC_EX_MISS
Definition: SpellMgr.h:196
@ PROC_EX_RESIST
Definition: SpellMgr.h:197
@ PROC_EX_FULL_BLOCK
Definition: SpellMgr.h:207
@ PROC_EX_ABSORB
Definition: SpellMgr.h:204
@ PROC_EX_PARRY
Definition: SpellMgr.h:199
@ PROC_EX_EVADE
Definition: SpellMgr.h:201
@ PROC_FLAG_DONE_MELEE_AUTO_ATTACK
Definition: SpellMgr.h:110
@ PROC_FLAG_DONE_MAINHAND_ATTACK
Definition: SpellMgr.h:140
@ PROC_FLAG_TAKEN_DAMAGE
Definition: SpellMgr.h:137
@ PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK
Definition: SpellMgr.h:111
@ PROC_FLAG_DONE_OFFHAND_ATTACK
Definition: SpellMgr.h:141
@ PROC_FLAG_NONE
Definition: SpellMgr.h:105
@ VICTIMSTATE_INTACT
Definition: Unit.h:83
@ VICTIMSTATE_HIT
Definition: Unit.h:84
@ VICTIMSTATE_DODGE
Definition: Unit.h:85
@ VICTIMSTATE_IS_IMMUNE
Definition: Unit.h:90
@ VICTIMSTATE_PARRY
Definition: Unit.h:86
@ VICTIMSTATE_BLOCKS
Definition: Unit.h:88
@ VICTIMSTATE_EVADES
Definition: Unit.h:89
@ HITINFO_PARTIAL_ABSORB
Definition: Unit.h:103
@ HITINFO_FULL_RESIST
Definition: Unit.h:104
@ HITINFO_NORMALSWING
Definition: Unit.h:96
@ HITINFO_BLOCK
Definition: Unit.h:110
@ HITINFO_CRUSHING
Definition: Unit.h:114
@ HITINFO_SWINGNOHITSOUND
Definition: Unit.h:118
@ HITINFO_MISS
Definition: Unit.h:101
@ HITINFO_FULL_ABSORB
Definition: Unit.h:102
@ HITINFO_OFFHAND
Definition: Unit.h:99
@ HITINFO_GLANCING
Definition: Unit.h:113
@ HITINFO_CRITICALHIT
Definition: Unit.h:106
@ HITINFO_PARTIAL_RESIST
Definition: Unit.h:105
@ HITINFO_AFFECTS_VICTIM
Definition: Unit.h:98
@ MELEE_HIT_CRUSHING
Definition: Unit.h:286
@ MELEE_HIT_BLOCK
Definition: Unit.h:285
@ MELEE_HIT_CRIT
Definition: Unit.h:286
@ MELEE_HIT_EVADE
Definition: Unit.h:285
@ MELEE_HIT_DODGE
Definition: Unit.h:285
@ MELEE_HIT_MISS
Definition: Unit.h:285
@ MELEE_HIT_PARRY
Definition: Unit.h:285
@ MELEE_HIT_GLANCING
Definition: Unit.h:286
virtual void OnCalculateMeleeDamageReceived(uint32 &, Unit *)
Called during damage calculations.
Definition: UnitAI.h:381
uint32 damageSchoolMask
Definition: Unit.h:469
uint32 blocked_amount
Definition: Unit.h:475
MeleeHitOutcome hitOutCome
Definition: Unit.h:484
uint32 cleanDamage
Definition: Unit.h:483
uint32 TargetState
Definition: Unit.h:477
uint32 resist
Definition: Unit.h:472
uint32 HitInfo
Definition: Unit.h:476
bool isBlockCritical()
Definition: Unit.cpp:3126
uint32 MeleeDamageBonusTaken(Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition: Unit.cpp:13276
virtual SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition: Unit.cpp:5961
bool CanApplyResilience() const
Definition: Unit.h:1093
uint32 CalculateDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
Definition: Unit.cpp:2984
virtual uint32 GetShieldBlockValue() const =0
static void ApplyResilience(Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
Definition: Unit.cpp:18928
UnitAI * GetAI()
Definition: Unit.h:658
static bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
Definition: Unit.cpp:2008
int32 GetTotalAuraModifier(AuraType auratype) const
Definition: Unit.cpp:5910
MeleeHitOutcome RollMeleeOutcomeAgainst(Unit const *victim, WeaponAttackType attType) const
Definition: Unit.cpp:2781
uint32 GetCreatureTypeMask() const
Definition: Unit.h:785
uint32 MeleeDamageBonusDone(Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition: Unit.cpp:13074

References CalcDamageInfo::absorb, AddPct(), CalcDamageInfo::attacker, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, CalcArmorReducedDamage(), CalculateDamage(), CalcDamageInfo::cleanDamage, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, GetAI(), GetCreatureTypeMask(), GetLevel(), GetMeleeDamageSchoolMask(), GetShieldBlockValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), GetTotalAuraMultiplierByMiscMask(), CalcDamageInfo::HitInfo, HITINFO_AFFECTS_VICTIM, HITINFO_BLOCK, HITINFO_CRITICALHIT, HITINFO_CRUSHING, HITINFO_GLANCING, HITINFO_MISS, HITINFO_NORMALSWING, HITINFO_OFFHAND, HITINFO_SWINGNOHITSOUND, CalcDamageInfo::hitOutCome, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), IsImmunedToDamageOrSchool(), Object::IsPlayer(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_BLOCK, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_DODGE, MELEE_HIT_EVADE, MELEE_HIT_GLANCING, MELEE_HIT_MISS, MELEE_HIT_NORMAL, MELEE_HIT_PARRY, MeleeDamageBonusDone(), MeleeDamageBonusTaken(), OFF_ATTACK, UnitAI::OnCalculateMeleeDamageReceived(), PROC_EX_BLOCK, PROC_EX_CRITICAL_HIT, PROC_EX_DODGE, PROC_EX_EVADE, PROC_EX_FULL_BLOCK, PROC_EX_IMMUNE, PROC_EX_MISS, PROC_EX_NONE, PROC_EX_NORMAL_HIT, PROC_EX_PARRY, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_MELEE_AUTO_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_NONE, PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK, CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, RANGED_ATTACK, CalcDamageInfo::resist, RollMeleeOutcomeAgainst(), SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_SCHOOL_MASK_NORMAL, sScriptMgr, CalcDamageInfo::target, CalcDamageInfo::TargetState, VICTIMSTATE_BLOCKS, VICTIMSTATE_DODGE, VICTIMSTATE_EVADES, VICTIMSTATE_HIT, VICTIMSTATE_INTACT, VICTIMSTATE_IS_IMMUNE, and VICTIMSTATE_PARRY.

Referenced by AttackerStateUpdate(), and spell_dk_dancing_rune_weapon::HandleProc().

◆ CalculateMinMaxDamage()

virtual void Unit::CalculateMinMaxDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
float &  minDamage,
float &  maxDamage,
uint8  damageIndex = 0 
)
pure virtual

Implemented in Creature, and Player.

Referenced by CalculateDamage(), and UpdateDamagePhysical().

◆ CalculateSpellDamage()

int32 Unit::CalculateSpellDamage ( Unit const *  target,
SpellInfo const *  spellProto,
uint8  effect_index,
int32 const *  basePoints = nullptr 
) const

◆ CalculateSpellDamageTaken()

void Unit::CalculateSpellDamageTaken ( SpellNonMeleeDamage damageInfo,
int32  damage,
SpellInfo const *  spellInfo,
WeaponAttackType  attackType = BASE_ATTACK,
bool  crit = false 
)
1296{
1297 if (damage < 0)
1298 return;
1299
1300 Unit* victim = damageInfo->target;
1301 if (!victim || !victim->IsAlive())
1302 return;
1303
1304 SpellSchoolMask damageSchoolMask = SpellSchoolMask(damageInfo->schoolMask);
1305 uint32 crTypeMask = victim->GetCreatureTypeMask();
1306
1307 // Script Hook For CalculateSpellDamageTaken -- Allow scripts to change the Damage post class mitigation calculations
1308 sScriptMgr->ModifySpellDamageTaken(damageInfo->target, damageInfo->attacker, damage, spellInfo);
1309
1310 if (victim->GetAI())
1311 {
1312 victim->GetAI()->OnCalculateSpellDamageReceived(damage, this);
1313 }
1314
1315 int32 cleanDamage = 0;
1316 if (Unit::IsDamageReducedByArmor(damageSchoolMask, spellInfo))
1317 {
1318 int32 oldDamage = damage;
1319 damage = Unit::CalcArmorReducedDamage(this, victim, damage, spellInfo, 0, attackType);
1320 cleanDamage = oldDamage - damage;
1321 }
1322
1323 bool blocked = false;
1324 // Per-school calc
1325 switch (spellInfo->DmgClass)
1326 {
1327 // Melee and Ranged Spells
1330 {
1331 // Physical Damage
1332 if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL)
1333 {
1334 // Get blocked status
1335 blocked = isSpellBlocked(victim, spellInfo, attackType);
1336 }
1337
1338 if (crit)
1339 {
1340 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1341
1342 // Calculate crit bonus
1343 uint32 crit_bonus = damage;
1344 // Apply crit_damage bonus for melee spells
1345 if (Player* modOwner = GetSpellModOwner())
1346 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
1347 damage += crit_bonus;
1348
1349 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1350 float critPctDamageMod = 0.0f;
1351 if (attackType == RANGED_ATTACK)
1353 else
1355
1356 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1357 critPctDamageMod += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellInfo->GetSchoolMask());
1358
1359 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1361
1362 if (critPctDamageMod != 0)
1363 AddPct(damage, critPctDamageMod);
1364 }
1365
1366 // Spell weapon based damage CAN BE crit & blocked at same time
1367 if (blocked)
1368 {
1369 damageInfo->blocked = victim->GetShieldBlockValue();
1370 // double blocked amount if block is critical
1371 if (victim->isBlockCritical())
1372 damageInfo->blocked *= 2;
1373 if (damage < int32(damageInfo->blocked))
1374 damageInfo->blocked = uint32(damage);
1375
1376 damage -= damageInfo->blocked;
1377 cleanDamage += damageInfo->blocked;
1378 }
1379
1380 int32 resilienceReduction = damage;
1381 if (CanApplyResilience())
1382 {
1383 if (attackType != RANGED_ATTACK)
1384 {
1385 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_MELEE);
1386 }
1387 else
1388 {
1389 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_RANGED);
1390 }
1391 }
1392
1393 resilienceReduction = damage - resilienceReduction;
1394 damage -= resilienceReduction;
1395 cleanDamage += resilienceReduction;
1396 break;
1397 }
1398 // Magical Attacks
1401 {
1402 // If crit add critical bonus
1403 if (crit)
1404 {
1405 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1406 damage = Unit::SpellCriticalDamageBonus(this, spellInfo, damage, victim);
1407 }
1408
1409 int32 resilienceReduction = damage;
1410 if (CanApplyResilience())
1411 {
1412 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_SPELL);
1413 }
1414
1415 resilienceReduction = damage - resilienceReduction;
1416 damage -= resilienceReduction;
1417 cleanDamage += resilienceReduction;
1418 break;
1419 }
1420 default:
1421 break;
1422 }
1423
1424 damageInfo->cleanDamage = std::max(0, cleanDamage);
1425 damageInfo->damage = std::max(0, damage);
1426
1427 // Calculate absorb resist
1428 if (damageInfo->damage > 0)
1429 {
1430 DamageInfo dmgInfo(*damageInfo, SPELL_DIRECT_DAMAGE);
1431 Unit::CalcAbsorbResist(dmgInfo);
1432 damageInfo->absorb = dmgInfo.GetAbsorb();
1433 damageInfo->resist = dmgInfo.GetResist();
1434 damageInfo->damage = dmgInfo.GetDamage();
1435 }
1436}
@ SPELL_DAMAGE_CLASS_RANGED
Definition: SharedDefines.h:1548
@ SPELL_DAMAGE_CLASS_MAGIC
Definition: SharedDefines.h:1546
@ SPELL_DAMAGE_CLASS_NONE
Definition: SharedDefines.h:1545
@ SPELL_DAMAGE_CLASS_MELEE
Definition: SharedDefines.h:1547
@ SPELL_HIT_TYPE_CRIT
Definition: SharedDefines.h:1536
@ SPELLMOD_CRIT_DAMAGE_BONUS
Definition: SpellDefines.h:91
@ SPELL_DIRECT_DAMAGE
Definition: Unit.h:249
virtual void OnCalculateSpellDamageReceived(int32 &, Unit *)
Definition: UnitAI.h:382
Unit * target
Definition: Unit.h:495
uint32 HitInfo
Definition: Unit.h:506
uint32 damage
Definition: Unit.h:498
uint32 absorb
Definition: Unit.h:501
Unit * attacker
Definition: Unit.h:496
uint32 schoolMask
Definition: Unit.h:500
uint32 cleanDamage
Definition: Unit.h:508
uint32 resist
Definition: Unit.h:502
uint32 blocked
Definition: Unit.h:505
bool isSpellBlocked(Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
Definition: Unit.cpp:3100
static uint32 SpellCriticalDamageBonus(Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
Definition: Unit.cpp:12281

References SpellNonMeleeDamage::absorb, AddPct(), ApplyResilience(), SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CalcAbsorbResist(), CalcArmorReducedDamage(), CanApplyResilience(), SpellNonMeleeDamage::cleanDamage, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, SpellNonMeleeDamage::damage, SpellInfo::DmgClass, DamageInfo::GetAbsorb(), GetAI(), GetCreatureTypeMask(), DamageInfo::GetDamage(), DamageInfo::GetResist(), SpellInfo::GetSchoolMask(), GetShieldBlockValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), isSpellBlocked(), UnitAI::OnCalculateSpellDamageReceived(), RANGED_ATTACK, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_DIRECT_DAMAGE, SPELL_HIT_TYPE_CRIT, SPELL_SCHOOL_MASK_NORMAL, SpellCriticalDamageBonus(), SPELLMOD_CRIT_DAMAGE_BONUS, sScriptMgr, and SpellNonMeleeDamage::target.

Referenced by Spell::DoAllEffectOnTarget(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ CanApplyResilience()

bool Unit::CanApplyResilience ( ) const
inline

◆ CanDualWield()

◆ CanEnterWater()

virtual bool Unit::CanEnterWater ( ) const
pure virtual

Implemented in Creature, and Player.

◆ CanFly()

◆ CanFreeMove()

bool Unit::CanFreeMove ( ) const
inline
1590 {
1593 }
@ UNIT_STATE_DISTRACTED
Definition: UnitDefines.h:161
@ UNIT_STATE_CONFUSED
Definition: UnitDefines.h:160
@ UNIT_STATE_FLEEING
Definition: UnitDefines.h:156
@ UNIT_STATE_IN_FLIGHT
Definition: UnitDefines.h:157
@ UNIT_STATE_STUNNED
Definition: UnitDefines.h:152

References GetOwnerGUID(), HasUnitState(), UNIT_STATE_CONFUSED, UNIT_STATE_DISTRACTED, UNIT_STATE_FLEEING, UNIT_STATE_IN_FLIGHT, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by Creature::IsFreeToMove().

◆ CanHaveThreatList()

bool Unit::CanHaveThreatList ( bool  skipAliveCheck = false) const
14615{
14616 // only creatures can have threat list
14617 if (!IsCreature())
14618 return false;
14619
14620 // only alive units can have threat list
14621 if (!skipAliveCheck && !IsAlive())
14622 return false;
14623
14624 // totems can not have threat list
14625 if (ToCreature()->IsTotem())
14626 return false;
14627
14628 // vehicles can not have threat list
14629 if (ToCreature()->IsVehicle() && GetMap()->IsBattlegroundOrArena())
14630 return false;
14631
14632 // summons can not have a threat list, unless they are controlled by a creature
14634 return false;
14635
14636 return true;
14637}
@ UNIT_MASK_CONTROLABLE_GUARDIAN
Definition: UnitDefines.h:143
@ UNIT_MASK_GUARDIAN
Definition: UnitDefines.h:137
Map * GetMap() const
Definition: Object.h:531
bool IsVehicle() const
Definition: Unit.h:757

References WorldObject::GetMap(), GetOwnerGUID(), HasUnitTypeMask(), IsAlive(), Object::IsCreature(), Object::IsPlayer(), IsTotem(), IsVehicle(), Object::ToCreature(), UNIT_MASK_CONTROLABLE_GUARDIAN, UNIT_MASK_GUARDIAN, and UNIT_MASK_MINION.

Referenced by AddThreat(), Creature::CanPeriodicallyCallForAssistance(), ThreatMgr::ClearAllThreat(), DealDamage(), ScriptedAI::DoResetThreatList(), CreatureAI::DoZoneInCombat(), Spell::EffectTaunt(), Spell::EffectThreat(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleModTaunt(), Spell::HandleThreatSpells(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), Creature::SelectVictim(), TauntApply(), TauntFadeOut(), and Update().

◆ CanInstantCast()

bool Unit::CanInstantCast ( ) const
inline
1459{ return _instantCast; }

References _instantCast.

Referenced by ModSpellCastTime().

◆ CanModifyStats()

◆ CanProc()

bool Unit::CanProc ( )
inline
1430{ return !m_procDeep; }

References m_procDeep.

Referenced by Spell::DoAllEffectOnTarget().

◆ CanRestoreMana()

bool Unit::CanRestoreMana ( SpellInfo const *  spellInfo) const
21234{
21235 // Aura of Despair exceptions
21236 switch (spellInfo->Id)
21237 {
21238 case 16666: // Demonic Rune
21239 case 27869: // Dark Rune
21240 case 30824: // Shamanistic Rage
21241 case 31786: // Spiritual Attunement
21242 case 31930: // Judgements of the Wise
21243 case 34075: // Aspect of the Viper
21244 case 34720: // Thrill of the hunt
21245 case 47755: // Rapture
21246 case 54425: // Improved Felhunter
21247 case 57319: // Blessing of Sanctuary
21248 case 63337: // Saronite Vapors (regenerate mana)
21249 case 63375: // Improved stormstrike
21250 case 64372: // Lifebloom
21251 case 68285: // Improved Leader of the Pack
21252 return true;
21253 case 54428: // Divine Plea - only with talent Guarded by the Light
21254 return HasSpell(53583);
21255 default:
21256 break;
21257 }
21258
21259 return false;
21260}
virtual bool HasSpell(uint32) const
Definition: Unit.h:1454

References HasSpell(), and SpellInfo::Id.

Referenced by IsImmunedToSpellEffect().

◆ CanSwim()

bool Unit::CanSwim ( ) const
virtual

this method checks the current flag of a unit

These flags can be set within the database or dynamically changed at runtime UNIT_FLAG_SWIMMING must be updated when a unit enters a swimmable area

Reimplemented in Creature.

19967{
19968 // Mirror client behavior, if this method returns false then client will not use swimming animation and for players will apply gravity as if there was no water
19970 return false;
19972 return true;
19974 return false;
19976 return true;
19978}
@ UNIT_FLAG2_UNUSED_6
Definition: UnitDefines.h:286
@ UNIT_FLAG_CANNOT_SWIM
Definition: UnitDefines.h:243
@ UNIT_FLAG_POSSESSED
Definition: UnitDefines.h:253
@ UNIT_FLAG_SWIMMING
Definition: UnitDefines.h:244
@ UNIT_FLAG_RENAME
Definition: UnitDefines.h:233
@ UNIT_FLAG_PET_IN_COMBAT
Definition: UnitDefines.h:240
bool HasUnitFlag2(UnitFlags2 flags) const
Definition: Unit.h:718

References HasUnitFlag(), HasUnitFlag2(), UNIT_FLAG2_UNUSED_6, UNIT_FLAG_CANNOT_SWIM, UNIT_FLAG_PET_IN_COMBAT, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_POSSESSED, UNIT_FLAG_RENAME, and UNIT_FLAG_SWIMMING.

Referenced by Creature::CanSwim().

◆ CanUseAttackType()

◆ CastCustomSpell() [1/4]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
CustomSpellValues const &  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1251{
1252 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1253 if (!spellInfo)
1254 {
1255 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1257 }
1258
1259 SpellCastTargets targets;
1260 targets.SetUnitTarget(victim);
1261
1262 return CastSpell(targets, spellInfo, &value, triggerFlags, castItem, triggeredByAura, originalCaster);
1263}
#define LOG_ERROR(filterType__,...)
Definition: Log.h:157
@ SPELL_FAILED_SPELL_UNAVAILABLE
Definition: SharedDefines.h:1056
Definition: Spell.h:111
void SetUnitTarget(Unit *target)
Definition: Spell.cpp:239

References CastSpell(), Object::GetGUID(), LOG_ERROR, SpellCastTargets::SetUnitTarget(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, and Position::ToString().

◆ CastCustomSpell() [2/4]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
SpellValueMod  mod,
int32  value,
Unit victim,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1237{
1238 CustomSpellValues values;
1239 values.AddSpellMod(mod, value);
1240 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1241}
@ TRIGGERED_NONE
Definition: SpellDefines.h:133
SpellCastResult CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition: Unit.cpp:1224
Definition: SpellDefines.h:165
void AddSpellMod(SpellValueMod mod, int32 value)
Definition: SpellDefines.h:167

References CustomSpellValues::AddSpellMod(), CastCustomSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastCustomSpell() [3/4]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
SpellValueMod  mod,
int32  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1244{
1245 CustomSpellValues values;
1246 values.AddSpellMod(mod, value);
1247 return CastCustomSpell(spellId, values, target, triggerFlags, castItem, triggeredByAura, originalCaster);
1248}

References CustomSpellValues::AddSpellMod(), and CastCustomSpell().

◆ CastCustomSpell() [4/4]

SpellCastResult Unit::CastCustomSpell ( Unit victim,
uint32  spellId,
int32 const *  bp0,
int32 const *  bp1,
int32 const *  bp2,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1225{
1226 CustomSpellValues values;
1227 if (bp0)
1228 values.AddSpellMod(SPELLVALUE_BASE_POINT0, *bp0);
1229 if (bp1)
1230 values.AddSpellMod(SPELLVALUE_BASE_POINT1, *bp1);
1231 if (bp2)
1232 values.AddSpellMod(SPELLVALUE_BASE_POINT2, *bp2);
1233 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1234}
@ SPELLVALUE_BASE_POINT1
Definition: SpellDefines.h:114
@ SPELLVALUE_BASE_POINT2
Definition: SpellDefines.h:115
@ SPELLVALUE_BASE_POINT0
Definition: SpellDefines.h:113

References CustomSpellValues::AddSpellMod(), CastCustomSpell(), SPELLVALUE_BASE_POINT0, SPELLVALUE_BASE_POINT1, SPELLVALUE_BASE_POINT2, TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

Referenced by spell_pri_guardian_spirit::Absorb(), spell_mage_fire_frost_ward::Absorb(), spell_pal_ardent_defender::Absorb(), spell_dru_survival_instincts_aura::AfterApply(), spell_the_lich_king_necrotic_plague_jump_aura::AfterDispel(), spell_dru_lifebloom::AfterRemove(), Player::ApplyEnchantment(), Player::ApplyEquipSpell(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), npc_gas_cloud::npc_gas_cloudAI::CastMainSpell(), CastPetAura(), spell_ruby_sanctum_rallying_shout::CountAllies(), spell_igb_rocket_artillery_explosion::DamageGunship(), boss_illidari_council_memberAI::DamageTaken(), boss_leotheras_the_blind::DemonTime(), spell_warl_seed_of_corruption_generic_aura::Detonate(), boss_sister_svalna::boss_sister_svalnaAI::DoAction(), Spell::EffectDestroyAllTotems(), Spell::EffectDispel(), Spell::EffectFeedPet(), Spell::EffectForceCast(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSummonType(), EnterVehicle(), EnterVehicleUnattackable(), AuraMunchingQueue::Execute(), TriggerWickedSpirit::Execute(), spell_sha_totem_of_wrath::HandleAfterCast(), spell_reflective_shield_aura::HandleAfterEffectAbsorb(), spell_dk_scourge_strike::HandleAfterHit(), spell_dru_enrage::HandleApply(), spell_pal_avenging_wrath::HandleApply(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModShapeshift(), HandleAuraProc(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_pri_shadow_word_death::HandleDamage(), spell_dk_corpse_explosion::HandleDamage(), spell_dru_lifebloom::HandleDispel(), spell_igb_burning_pitch::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_deathbringer_blood_link::HandleDummy(), spell_dk_death_coil::HandleDummy(), spell_dk_death_strike::HandleDummy(), spell_gen_dummy_trigger::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_pal_divine_storm_dummy::HandleDummy(), spell_sha_ancestral_awakening_proc::HandleDummy(), spell_sha_cleansing_totem_pulse::HandleDummy(), spell_warl_life_tap::HandleDummy(), spell_warr_last_stand::HandleDummy(), spell_warr_charge::HandleDummy(), spell_warr_slam::HandleDummy(), spell_warr_bloodthirst::HandleDummy(), HandleDummyAuraProc(), spell_egg_explosion::HandleDummyHitTarget(), spell_warr_execute::HandleEffect(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_serpentshrine_cavern_infection::HandleEffectRemove(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_ragin_flames_inferno::HandlePeriodic(), spell_dk_death_and_decay_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_deathbringer_blood_link_aura::HandleProc(), spell_deathbringer_blood_link_blood_beast_aura::HandleProc(), spell_reliquary_of_souls_aura_of_desire_aura::HandleProc(), spell_black_temple_consuming_strikes_aura::HandleProc(), spell_item_blade_ward_enchant::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), spell_dru_living_seed_proc::HandleProc(), spell_hun_ascpect_of_the_viper::HandleProc(), spell_sha_earth_shield::HandleProc(), spell_the_lich_king_dark_hunger_aura::HandleProc(), spell_yogg_saron_grim_reprisal_aura::HandleProc(), spell_dk_wandering_plague_aura::HandleProc(), spell_dk_blood_gorged::HandleProc(), spell_dru_living_seed::HandleProc(), spell_gen_blade_warding::HandleProc(), spell_hun_glyph_of_arcane_shot::HandleProc(), spell_item_blessing_of_ancient_kings::HandleProc(), spell_item_necrotic_touch::HandleProc(), spell_mage_burnout::HandleProc(), spell_pal_seal_of_command_aura::HandleProc(), spell_pal_sacred_shield_base::HandleProc(), spell_pal_seal_of_righteousness::HandleProc(), spell_pri_divine_aegis::HandleProc(), spell_pri_glyph_of_prayer_of_healing::HandleProc(), spell_rog_blade_flurry::HandleProc(), spell_sha_item_mana_surge::HandleProc(), spell_warr_sweeping_strikes::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleProcTriggerSpellWithValueAuraProc(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_igb_rocket_pack_aura::HandleRemove(), spell_warl_haunt_aura::HandleRemove(), spell_pal_lay_on_hands::HandleScript(), spell_kelthuzad_detonate_mana_aura::HandleScript(), spell_q12919_gymers_grab::HandleScript(), spell_gluth_decimate::HandleScriptEffect(), spell_hun_chimera_shot::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), spell_illidari_council_circle_of_healing::HandleSharedRule(), HandleSpellClick(), spell_halion_damage_aoe_summon::HandleSummon(), spell_putricide_mutated_transformation::HandleSummon(), spell_putricide_mutated_plague_aura::HandleTriggerSpell(), boss_sathrovarr::JustEngagedWith(), boss_essence_of_suffering::boss_essence_of_sufferingAI::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_felblood_kaelthas::JustEngagedWith(), boss_alythess::JustEngagedWith(), boss_kalecgos::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_mother_shahraz::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_najentus::JustEngagedWith(), boss_morogrim_tidewalker::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_janalai_hatcher::MovementInform(), npc_frost_tomb::npc_frost_tomb(), spell_dru_tiger_s_fury::OnHit(), spell_gen_flurry_of_claws::OnPeriodic(), spell_blood_queen_essence_of_the_blood_queen_aura::OnProc(), spell_pal_eye_for_an_eye::OnProc(), spell_warl_siphon_life::OnProc(), spell_warl_fel_synergy::OnProc(), spell_warr_improved_spell_reflection::OnProc(), spell_warr_damage_shield::OnProc(), spell_kalecgos_curse_of_boundless_agony_aura::OnRemove(), spell_halion_marks_aura::OnRemove(), spell_putricide_mutated_plague_aura::OnRemove(), spell_the_lich_king_necrotic_plague_aura::OnRemove(), spell_yogg_saron_malady_of_the_mind_aura::OnRemove(), spell_sindragosa_instability_aura::OnRemove(), spell_the_lich_king_necrotic_plague_jump_aura::OnRemove(), spell_karazhan_overload_aura::PeriodicTick(), spell_entropius_negative_energy_periodic::PeriodicTick(), spell_doomfire::PeriodicTick(), spell_blood_queen_pact_of_the_darkfallen_dmg_aura::PeriodicTick(), spell_broggok_poison_cloud::PeriodicTick(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11198_take_down_tethyr::PrepareSpellScript(), spell_illidari_council_reflective_shield_aura::ReflectDamage(), spell_pri_power_word_shield_aura::ReflectDamage(), boss_kiljaeden::Reset(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), boss_magtheridon::ScheduleCombatEvents(), boss_felmyst::ScheduleFlightSequence(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::SpellHitTarget(), npc_simon_bunny::npc_simon_bunnyAI::SpellHitTarget(), boss_viscidus::SummonedCreatureDies(), spell_dk_anti_magic_shell_self::Trigger(), spell_mage_incanters_absorbtion_base_AuraScript::Trigger(), spell_the_lich_king_life_siphon::TriggerHeal(), spell_pal_divine_storm::TriggerHeal(), spell_black_temple_shadow_inferno_aura::Update(), spell_black_temple_spell_absorption_aura::Update(), npc_coren_direbrew::UpdateAI(), boss_huhuran::UpdateAI(), boss_krik_thir::boss_krik_thirAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_faerlina::boss_faerlinaAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_living_constellation::npc_living_constellationAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), and boss_toravon::boss_toravonAI::UpdateAI().

◆ CastDelayedSpellWithPeriodicAmount()

void Unit::CastDelayedSpellWithPeriodicAmount ( Unit caster,
uint32  spellId,
AuraType  auraType,
int32  addAmount,
uint8  effectIndex = 0 
)
20308{
20309 AuraEffect* aurEff = nullptr;
20310 for (AuraEffectList::iterator i = m_modAuras[auraType].begin(); i != m_modAuras[auraType].end(); ++i)
20311 {
20312 aurEff = *i;
20313 if (aurEff->GetCasterGUID() != caster->GetGUID() || aurEff->GetId() != spellId || aurEff->GetEffIndex() != effectIndex || !aurEff->GetTotalTicks())
20314 continue;
20315
20316 addAmount += ((aurEff->GetOldAmount() * std::max<int32>(aurEff->GetTotalTicks() - int32(aurEff->GetTickNumber()), 0)) / aurEff->GetTotalTicks());
20317 break;
20318 }
20319
20320 // xinef: delay only for casting on different unit
20321 if (this == caster || !sWorld->getBoolConfig(CONFIG_MUNCHING_BLIZZLIKE))
20322 caster->CastCustomSpell(spellId, SPELLVALUE_BASE_POINT0, addAmount, this, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_NO_PERIODIC_RESET), nullptr, aurEff, caster->GetGUID());
20323 else
20324 caster->m_Events.AddEvent(new AuraMunchingQueue(*caster, GetGUID(), addAmount, spellId, aurEff, auraType), caster->m_Events.CalculateQueueTime(400));
20325}
TriggerCastFlags
Definition: SpellDefines.h:132
@ TRIGGERED_NO_PERIODIC_RESET
Will ignore equipped item requirements.
Definition: SpellDefines.h:152
@ CONFIG_MUNCHING_BLIZZLIKE
Definition: IWorld.h:184
uint64 CalculateQueueTime(uint64 delay) const
Definition: EventProcessor.cpp:164
Definition: Unit.cpp:20274
uint32 GetTickNumber() const
Definition: SpellAuraEffects.h:87
int32 GetOldAmount() const
Definition: SpellAuraEffects.h:116
uint32 GetId() const
Definition: SpellAuraEffects.cpp:432
int32 GetTotalTicks() const
Definition: SpellAuraEffects.cpp:7370
ObjectGuid GetCasterGUID() const
Definition: SpellAuraEffects.h:48

References EventProcessor::AddEvent(), EventProcessor::CalculateQueueTime(), CastCustomSpell(), CONFIG_MUNCHING_BLIZZLIKE, AuraEffect::GetCasterGUID(), AuraEffect::GetEffIndex(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetOldAmount(), AuraEffect::GetTickNumber(), AuraEffect::GetTotalTicks(), m_Events, m_modAuras, SPELLVALUE_BASE_POINT0, sWorld, TRIGGERED_FULL_MASK, and TRIGGERED_NO_PERIODIC_RESET.

Referenced by HandleDummyAuraProc(), spell_mage_ignite::HandleProc(), spell_dru_t10_balance_4p_bonus::HandleProc(), spell_sha_t10_restoration_4p_bonus::HandleProc(), spell_sha_t8_electrified::HandleProc(), and HandleProcTriggerSpell().

◆ CastPetAura()

void Unit::CastPetAura ( PetAura const *  aura)
17323{
17324 uint32 auraId = aura->GetAura(GetEntry());
17325 if (!auraId)
17326 return;
17327
17328 if (auraId == 35696) // Demonic Knowledge
17329 {
17330 int32 basePoints = aura->GetDamage();
17331 CastCustomSpell(this, auraId, &basePoints, nullptr, nullptr, true);
17332 }
17333 else
17334 CastSpell(this, auraId, true);
17335}

References CastCustomSpell(), CastSpell(), PetAura::GetAura(), PetAura::GetDamage(), and Object::GetEntry().

Referenced by Pet::CastPetAuras().

◆ CastSpell() [1/7]

SpellCastResult Unit::CastSpell ( float  x,
float  y,
float  z,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1266{
1267 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1268 if (!spellInfo)
1269 {
1270 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1272 }
1273
1274 SpellCastTargets targets;
1275 targets.SetDst(x, y, z, GetOrientation());
1276
1277 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1278}
void SetDst(float x, float y, float z, float orientation, uint32 mapId=MAPID_INVALID)
Definition: Spell.cpp:406

References CastSpell(), Object::GetGUID(), Position::GetOrientation(), LOG_ERROR, SpellCastTargets::SetDst(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, Position::ToString(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [2/7]

SpellCastResult Unit::CastSpell ( GameObject go,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1281{
1282 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1283 if (!spellInfo)
1284 {
1285 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1287 }
1288
1289 SpellCastTargets targets;
1290 targets.SetGOTarget(go);
1291
1292 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1293}
void SetGOTarget(GameObject *target)
Definition: Spell.cpp:271

References CastSpell(), Object::GetGUID(), LOG_ERROR, SpellCastTargets::SetGOTarget(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, Position::ToString(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [3/7]

SpellCastResult Unit::CastSpell ( SpellCastTargets const &  targets,
SpellInfo const *  spellInfo,
CustomSpellValues const *  value,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
Todo:
: this is a workaround - not needed anymore, but required for some scripts :(
1168{
1169 if (!spellInfo)
1170 {
1171 LOG_ERROR("entities.unit", "CastSpell: unknown spell by caster {}", GetGUID().ToString());
1173 }
1174
1176 if (!originalCaster && triggeredByAura)
1177 {
1178 originalCaster = triggeredByAura->GetCasterGUID();
1179 }
1180
1181 Spell* spell = new Spell(this, spellInfo, triggerFlags, originalCaster);
1182
1183 if (value)
1184 {
1185 for (CustomSpellValues::const_iterator itr = value->begin(); itr != value->end(); ++itr)
1186 {
1187 spell->SetSpellValue(itr->first, itr->second);
1188 }
1189 }
1190
1191 spell->m_CastItem = castItem;
1192 return spell->prepare(&targets, triggeredByAura);
1193}
void SetSpellValue(SpellValueMod mod, int32 value)
Definition: Spell.cpp:8437
Item * m_CastItem
Definition: Spell.h:524

References AuraEffect::GetCasterGUID(), Object::GetGUID(), LOG_ERROR, Spell::m_CastItem, Spell::prepare(), Spell::SetSpellValue(), SPELL_FAILED_SPELL_UNAVAILABLE, and Position::ToString().

Referenced by Player::_addSpell(), Player::_addTalentAurasAndSpells(), Spell::_cast(), _ExitVehicle(), Player::_LoadGlyphAuras(), Battleground::_ProcessResurrect(), spell_yogg_saron_protective_gaze_aura::Absorb(), spell_rog_cheat_death::Absorb(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Activate(), Player::ActivateSpec(), spell_halion_combustion_consumption_aura::AddMarkStack(), Battleground::AddPlayer(), Arena::AddPlayer(), BattlegroundIC::AddPlayer(), BattlegroundMap::AddPlayerToMap(), Battleground::AddPlayerToResurrectQueue(), Pet::addSpell(), spell_dru_barkskin::AfterApply(), spell_dru_savage_roar_aura::AfterApply(), spell_astromancer_wrath_of_the_astromancer::AfterRemove(), spell_gen_lifebloom::AfterRemove(), spell_oculus_stop_time_aura::Apply(), spell_sha_earthbind_totem::Apply(), spell_warl_health_funnel::ApplyEffect(), Player::ApplyEnchantment(), spell_hun_lock_and_load::ApplyMarker(), npc_mograine::npc_mograineAI::AshbringerEvent(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), boss_grand_champion::boss_grand_championAI::boss_grand_championAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::boss_yoggsaron_crusher_tentacleAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::boss_yoggsaron_death_orbAI(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::boss_yoggsaron_influence_tentacleAI(), WorldState::BuffAdalsSongOfBattle(), WorldState::BuffMagtheridonTeam(), Player::BuildPlayerRepop(), spell_igb_incinerating_blast::CalculateDamage(), spell_igb_cannon_blast::CalculatePower(), npc_echo_of_medivh::CastChangeFacing(), npc_chesspiece::CastChangeFacing(), CastCustomSpell(), npc_hallows_end_soh::CastFires(), Player::CastItemCombatSpell(), npc_volatile_ooze::npc_volatile_oozeAI::CastMainSpell(), CastPetAura(), boss_mor_grayhoof::CastRandomSpell(), GameObject::CastSpell(), CastSpell(), spell_the_lich_king_defile::ChangeDamageAndGrow(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), spell_eredar_twins_handle_touch::CheckCast(), Spell::CheckItems(), spell_botanica_shift_form_aura::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), spell_the_lich_king_shadow_trap_periodic::CheckTargetCount(), spell_dk_raise_dead::ConsumeReagents(), spell_frost_giant_death_plague::CountTargets(), instance_blackrock_spire::instance_blackrock_spireMapScript::CreatureLooted(), violet_hold_trashAI::CreatureStartAttackDoor(), boss_garfrost::boss_garfrostAI::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), npc_mograine::npc_mograineAI::DamageTaken(), boss_headless_horseman::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), npc_argent_soldier::npc_argent_soldierAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_gunship_boarding_addAI::DamageTaken(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), npc_collapsing_star::npc_collapsing_starAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), DealDamage(), DealMeleeDamage(), spell_warl_seed_of_corruption_aura::Detonate(), spell_warl_seed_of_corruption_generic_aura::Detonate(), boss_twin_valkyrAI::DoAction(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_icc_severed_essence::npc_icc_severed_essenceAI::DoAction(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), npc_eris_hevenfire::npc_eris_hevenfireAI::DoAction(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), boss_the_lich_king::boss_the_lich_kingAI::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_flame_leviathan::boss_flame_leviathanAI::DoAction(), boss_magtheridon::DoAction(), boss_sacrolash::DoAction(), boss_alythess::DoAction(), npc_kalecgos_kj::DoAction(), npc_pilgrims_bounty_chair::DoAction(), boss_black_knight::boss_black_knightAI::DoAction(), boss_jormungarAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_icc_blood_beast::npc_icc_blood_beastAI::DoAction(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_molten_golem::npc_molten_golemAI::DoAction(), boss_steelbreaker::boss_steelbreakerAI::DoAction(), npc_ulduar_bot_summon_trigger::npc_ulduar_bot_summon_triggerAI::DoAction(), boss_thorim_sif::boss_thorim_sifAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DoAction(), boss_yoggsaron_keeper::DoAction(), Spell::DoAllEffectOnTarget(), UnitAI::DoCast(), UnitAI::DoCastAOE(), ScriptedAI::DoCastSpell(), InstanceScript::DoCastSpellOnPlayer(), InstanceScript::DoCastSpellOnPlayers(), UnitAI::DoCastToAllHostilePlayers(), boss_maexxna::boss_maexxnaAI::DoCastWebWrap(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), npc_midsummer_ribbon_pole_target::DoFireworkChecks(), npc_midsummer_ribbon_pole_target::DoGroundFlowerChecks(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), npc_midsummer_ribbon_pole_target::DoSpewLavaChecks(), boss_skeram::DoTeleport(), Spell::DoTriggersOnSpellHit(), Player::DuelComplete(), Spell::EffectActivateRune(), Spell::EffectApplyGlyph(), Spell::EffectCastButtons(), Spell::EffectDummy(), Spell::EffectEnergize(), Spell::EffectForceCast(), Spell::EffectHeal(), Spell::EffectInebriate(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectStuck(), Spell::EffectSummonType(), Spell::EffectTaunt(), Spell::EffectTeleportUnits(), Spell::EffectTitanGrip(), Spell::EffectTriggerMissileSpell(), Spell::EffectTriggerRitualOfSummoning(), Spell::EffectTriggerSpell(), Spell::EffectWeaponDmg(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::EmpowerCultist(), boss_the_lich_king::boss_the_lich_kingAI::EnterEvadeMode(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), BattlegroundEY::EventTeamCapturedPoint(), BattleExperienceEvent::Execute(), OrcDeathEvent::Execute(), CastArmageddon::Execute(), UtherBatteredHiltEvent::Execute(), ShockVortexExplodeEvent::Execute(), ResetEncounterEvent::Execute(), FrostBombExplosion::Execute(), IceTombSummonEvent::Execute(), VileSpiritActivateEvent::Execute(), LichKingMovieEvent::Execute(), DelayedCastEvent::Execute(), DelayedCastMincharEvent::Execute(), ChargeRifts::Execute(), CosmicSmashDamageEvent::Execute(), CastRunesEvent::Execute(), BoomEvent::Execute(), SACActivateEvent::Execute(), VerasEnvenom::Execute(), CastQuill::Execute(), lapseTeleport::Execute(), boss_kaelthas::ExecuteMiddleEvent(), boss_salramm::boss_salrammAI::ExplodeGhoul(), spell_festergut_blighted_spores_aura::ExtraEffect(), spell_rotface_mutated_infection_aura::ExtraRemoveEffect(), npc_dark_iron_attack_generator::FinishAttackDueToWin(), npc_azure_saboteur::npc_azure_saboteurAI::FinishPointReached(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::FlyAway(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::GoSiphon(), go_soulwell::go_soulwellAI::GossipHello(), spell_cataclysm_breath::HandleAfterCast(), spell_dk_chains_of_ice::HandleAfterCast(), spell_mage_arcane_blast::HandleAfterCast(), spell_q13086_last_line_of_defence::HandleAfterCast(), spell_infected_worgen_bite_aura::HandleAfterEffectApply(), spell_dk_blood_boil::HandleAfterHit(), spell_dk_scourge_strike::HandleAfterHit(), spell_rog_deadly_poison::HandleAfterHit(), spell_warlords_rage::HandleAfterRemove(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), spell_felmyst_fog_of_corruption_charm_aura::HandleApply(), spell_kiljaeden_vengeance_of_the_blue_flight_aura::HandleApply(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), spell_dru_enrage::HandleApply(), spell_rog_killing_spree_aura::HandleApply(), spell_warr_vigilance::HandleApply(), spell_azjol_nerub_pound::HandleApplyAura(), BattlegroundIC::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModShapeshift(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_dk_death_grip::HandleBaseDummy(), misc_commandscript::HandleBindSightCommand(), spell_rotface_unstable_ooze_explosion_init::HandleCast(), spell_commander_sarannis_summon_reinforcements::HandleCast(), cast_commandscript::HandleCastBackCommand(), cast_commandscript::HandleCastCommand(), cast_commandscript::HandleCastDestCommand(), cast_commandscript::HandleCastDistCommand(), cast_commandscript::HandleCastSelfCommand(), cast_commandscript::HandleCastTargetCommad(), spell_gen_mounted_charge::HandleChargeEffect(), spell_dk_corpse_explosion::HandleCorpseExplosion(), OutdoorPvPSI::HandleCustomSpell(), WorldSession::HandleDuelCancelledOpcode(), spell_icc_shattered_bones::HandleDummy(), spell_corrupted_totems::HandleDummy(), spell_moroes_vanish::HandleDummy(), spell_karazhan_blink::HandleDummy(), spell_ooze_zap::HandleDummy(), spell_saviana_conflagration_init::HandleDummy(), spell_igb_burning_pitch_selector::HandleDummy(), spell_igb_burning_pitch::HandleDummy(), spell_charge_shield_bomber::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), spell_anti_air_rocket_bomber::HandleDummy(), spell_q13007_iron_colossus::HandleDummy(), spell_illidan_found_target::HandleDummy(), spell_leotheras_chaos_blast::HandleDummy(), spell_morogrim_tidewalker_watery_grave::HandleDummy(), spell_q10935_the_exorcism_of_colonel_jules::HandleDummy(), spell_gen_focused_bursts::HandleDummy(), spell_shadowblink::HandleDummy(), spell_spawn_drakonid::HandleDummy(), spell_send_mug_target_picker::HandleDummy(), spell_hallows_end_candy::HandleDummy(), spell_hallows_end_bucket_lands::HandleDummy(), spell_midsummer_torch_catch::HandleDummy(), spell_pilgrims_bounty_pass_generic::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_mana_burn_area::HandleDummy(), spell_voljin_war_drums::HandleDummy(), spell_voodoo::HandleDummy(), spell_sartharion_lava_strike::HandleDummy(), spell_halion_meteor_strike_targeting::HandleDummy(), spell_halion_twilight_division::HandleDummy(), spell_drakkari_colossus_emerge::HandleDummy(), spell_drakkari_colossus_surge::HandleDummy(), spell_putricide_ooze_eruption_searcher::HandleDummy(), spell_voa_flaming_cinder::HandleDummy(), spell_q12096_q12092_dummy::HandleDummy(), spell_vehicle_warhead_fuse::HandleDummy(), spell_q12589_shoot_rjr::HandleDummy(), spell_najentus_needle_spine::HandleDummy(), spell_ice_spear_target_picker::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), spell_gen_cannibalize::HandleDummy(), spell_gen_gadgetzan_transporter_backfire::HandleDummy(), spell_gen_gnomish_transporter::HandleDummy(), spell_hun_masters_call::HandleDummy(), spell_hun_pet_carrion_feeder::HandleDummy(), spell_item_gnomish_universal_remote::HandleDummy(), spell_item_gnomish_shrink_ray::HandleDummy(), spell_item_trigger_spell::HandleDummy(), spell_item_deviate_fish::HandleDummy(), spell_item_flask_of_the_north::HandleDummy(), spell_item_make_a_wish::HandleDummy(), spell_item_mingos_fortune_generator::HandleDummy(), spell_item_net_o_matic::HandleDummy(), spell_item_noggenfogger_elixir::HandleDummy(), spell_item_savory_deviate_delight::HandleDummy(), spell_item_six_demon_bag::HandleDummy(), spell_item_underbelly_elixir::HandleDummy(), spell_item_vanquished_clutches::HandleDummy(), spell_item_purify_helboar_meat::HandleDummy(), spell_item_reindeer_transformation::HandleDummy(), spell_item_nigh_invulnerability::HandleDummy(), spell_item_poultryizer::HandleDummy(), spell_item_socrethars_stone::HandleDummy(), spell_item_demon_broiled_surprise::HandleDummy(), spell_item_complete_raptor_capture::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), spell_item_nitro_boots::HandleDummy(), spell_item_teach_language::HandleDummy(), spell_item_rocket_boots::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_item_greatmothers_soulcatcher::HandleDummy(), spell_mage_summon_water_elemental::HandleDummy(), spell_pal_blessing_of_faith::HandleDummy(), spell_pal_holy_shock::HandleDummy(), spell_pal_judgement_of_command::HandleDummy(), spell_pri_penance::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_q5206_test_fetid_skull::HandleDummy(), spell_q11396_11399_scourging_crystal_controller::HandleDummy(), spell_q11587_arcane_prisoner_rescue::HandleDummy(), spell_q11730_ultrasonic_screwdriver::HandleDummy(), spell_q12634_despawn_fruit_tosser::HandleDummy(), spell_q12683_take_sputum_sample::HandleDummy(), spell_q12937_relief_for_the_fallen::HandleDummy(), spell_q9452_cast_net::HandleDummy(), spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy::HandleDummy(), spell_q12308_escape_from_silverbrook::HandleDummy(), spell_q12641_death_comes_from_on_high::HandleDummy(), spell_rog_shiv::HandleDummy(), spell_sha_fire_nova::HandleDummy(), spell_warl_ritual_of_doom_effect::HandleDummy(), spell_warl_soulshatter::HandleDummy(), spell_warr_charge::HandleDummy(), spell_magtheridon_shadow_grasp::HandleDummyApply(), HandleDummyAuraProc(), spell_yogg_saron_destabilization_matrix::HandleDummyEffect(), spell_yogg_saron_insane_periodic_trigger::HandleDummyEffect(), spell_image_of_drakuru_reagent_check::HandleDummyEffect(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_talon_king_ikiss_blink::HandleDummyHitTarget(), spell_shadowfang_keep_forsaken_skills_aura::HandleDummyTick(), spell_item_rocket_chicken::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_shadowfang_keep_haunting_spirits_aura::HandleDummyTick(), spell_blood_council_shadow_prison_aura::HandleDummyTick(), spell_mark_of_nature::HandleEffect(), spell_target_fissures::HandleEffect(), spell_rog_vanish::HandleEffect(), spell_mc_play_dead_aura::HandleEffectApply(), spell_lich_king_vo_blocker::HandleEffectApply(), spell_midsummer_ribbon_pole::HandleEffectApply(), spell_tharon_ja_dummy_aura::HandleEffectApply(), spell_reliquary_of_souls_aura_of_suffering_aura::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_leotheras_insidious_whisper_aura::HandleEffectApply(), spell_serpentshrine_cavern_coilfang_water::HandleEffectApply(), spell_q12851_going_bearback::HandleEffectApply(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_gen_whisper_gulch_yogg_saron_whisper::HandleEffectPeriodic(), spell_rog_killing_spree_aura::HandleEffectPeriodic(), spell_sha_earthbind_totem::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_hodir_flash_freeze_aura::HandleEffectPeriodic(), spell_warr_retaliation::HandleEffectProc(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_illidan_parasitic_shadowfiend_aura::HandleEffectRemove(), spell_illidan_parasitic_shadowfiend_trigger_aura::HandleEffectRemove(), spell_teron_gorefiend_shadow_of_death::HandleEffectRemove(), spell_black_temple_skeleton_shot_aura::HandleEffectRemove(), spell_hydross_cleansing_field_command::HandleEffectRemove(), spell_serpentshrine_cavern_serpentshrine_parasite::HandleEffectRemove(), spell_serpentshrine_cavern_serpentshrine_parasite_trigger_aura::HandleEffectRemove(), spell_q10930_big_bone_worm_aura::HandleEffectRemove(), spell_q10929_fumping_aura::HandleEffectRemove(), spell_flamewreath::HandleFinish(), spell_midsummer_fling_torch::HandleFinish(), spell_midsummer_juggling_torch::HandleFinish(), spell_wintergrasp_rp_gg::HandleFinish(), spell_dreamwalker_summoner::HandleForceCast(), spell_dreamwalker_summon_suppresser_effect::HandleForceCast(), spell_ioc_bomb_blast_criteria::HandleGameObjectDamage(), OPvPCapturePointZM_GraveYard::HandleGossipOption(), spell_item_crazy_alchemists_potion::HandleHeal(), spell_magtheridon_quake::HandleHit(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_sindragosa_frost_breath::HandleInfusion(), OutdoorPvPHP::HandleKillImpl(), OutdoorPvPNA::HandleKillImpl(), OutdoorPvPZM::HandleKillImpl(), BattlegroundIC::HandleKillUnit(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), spell_oculus_soar_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_ticking_time_bomb_aura::HandleOnEffectRemove(), spell_delusions_of_jindo::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), spell_mark_of_frost_freeze::HandleOnHit(), spell_mutate_explode_bug::HandleOnHit(), spell_explode_trigger::HandleOnHit(), spell_blade_dance_targeting::HandleOnHit(), HandleOverrideClassScriptAuraProc(), aura_class_call_wild_magic::HandlePeriodic(), spell_shadow_sickle_periodic_damage::HandlePeriodic(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_halion_meteor_strike_spread_aura::HandlePeriodic(), spell_sladran_grip_of_sladran_aura::HandlePeriodic(), spell_algalon_phase_punch_aura::HandlePeriodic(), spell_close_rift_aura::HandlePeriodic(), spell_serpentshrine_cavern_coilfang_water::HandlePeriodic(), spell_rancid_spore_cloud::HandlePeriodic(), spell_kaelthas_remote_toy::HandlePeriodic(), spell_q10923_evil_draws_near_periodic_aura::HandlePeriodic(), spell_sha_totemic_mastery::HandlePeriodic(), spell_garr_separation_anxiety_aura::HandlePeriodic(), spell_majordomo_separation_anxiety_aura::HandlePeriodic(), spell_kiljaeden_shadow_spike_aura::HandlePeriodic(), spell_kiljaeden_armageddon_periodic_aura::HandlePeriodic(), spell_halion_twilight_cutter_periodic_aura::HandlePeriodic(), spell_oculus_ride_ruby_emerald_amber_drake_que_aura::HandlePeriodic(), spell_hun_sniper_training::HandlePeriodic(), spell_shadow_bolt_whirl::HandlePeriodic(), spell_voa_overcharge_aura::HandlePeriodicDummy(), AuraEffect::HandlePeriodicDummyAuraTick(), spell_magtheridon_shadow_grasp::HandlePeriodicRemove(), spell_igb_periodic_trigger_with_power_cost_aura::HandlePeriodicTick(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), spell_bronjahm_soulstorm_channel_ooc_aura::HandlePeriodicTick(), spell_bronjahm_soulstorm_visual_aura::HandlePeriodicTick(), spell_item_direbrew_remote_aura::HandlePeriodicTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceMoveByAI(), OutdoorPvPEP::HandlePlayerEnterZone(), OutdoorPvPHP::HandlePlayerEnterZone(), OutdoorPvPNA::HandlePlayerEnterZone(), OutdoorPvPSI::HandlePlayerEnterZone(), OutdoorPvPTF::HandlePlayerEnterZone(), OutdoorPvPZM::HandlePlayerEnterZone(), WorldState::HandlePlayerEnterZone(), WorldSession::HandlePlayerLoginFromDB(), BattlegroundIC::HandlePlayerResurrect(), misc_commandscript::HandlePossessCommand(), spell_blood_queen_vampiric_bite::HandlePresence(), spell_mark_of_malice::HandleProc(), spell_item_lil_phylactery::HandleProc(), spell_item_fate_rune_of_unsurpassed_vigor::HandleProc(), spell_mage_burning_determination::HandleProc(), spell_rog_tricks_of_the_trade::HandleProc(), spell_gyth_chromatic_protection::HandleProc(), spell_ahune_spanky_hands::HandleProc(), spell_item_trauma::HandleProc(), spell_item_shadows_fate::HandleProc(), spell_utgarde_pinnacle_beast_mark::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_hun_improved_mend_pet::HandleProc(), spell_hun_misdirection::HandleProc(), spell_item_aegis_of_preservation::HandleProc(), spell_item_desperate_defense::HandleProc(), spell_mage_focus_magic::HandleProc(), spell_pal_blessing_of_sanctuary::HandleProc(), spell_pri_item_greater_heal_refund::HandleProc(), spell_pri_mana_leech::HandleProc(), spell_sha_item_lightning_shield_trigger::HandleProc(), spell_warr_vigilance::HandleProc(), spell_karazhan_temptation::HandleProc(), spell_dk_blood_caked_blade::HandleProc(), spell_dk_dancing_rune_weapon::HandleProc(), spell_gen_moss_covered_feet::HandleProc(), spell_item_unsated_craving::HandleProc(), spell_item_shadowmourne::HandleProc(), spell_sha_item_lightning_shield::HandleProc(), spell_warl_glyph_of_shadowflame::HandleProc(), spell_warr_sweeping_strikes::HandleProc(), spell_hun_lock_and_load::HandleProcs(), HandleProcTriggerSpell(), AuraEffect::HandleProcTriggerSpellAuraProc(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), AuraEffect::HandleRaidProcFromChargeAuraProc(), spell_dk_raise_dead::HandleRaiseDead(), spell_vael_burning_adrenaline::HandleRemove(), spell_kiljaeden_darkness_aura::HandleRemove(), spell_entropius_void_zone_visual_aura::HandleRemove(), spell_igb_rocket_pack_aura::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_gen_mine_sweeper::HandleSchoolDMG(), spell_warl_shadowflame::HandleSchoolDMG(), spell_gen_bandage::HandleScript(), spell_pal_lay_on_hands::HandleScript(), spell_kormok_summon_bone_mages::HandleScript(), spell_kormok_summon_bone_minions::HandleScript(), spell_energize_aoe::HandleScript(), spell_saviana_conflagration_throwback::HandleScript(), spell_taldaram_glittering_sparks::HandleScript(), spell_blood_queen_bloodbolt::HandleScript(), spell_blood_queen_presence_of_the_darkfallen::HandleScript(), spell_igb_rocket_artillery::HandleScript(), spell_putricide_unstable_experiment::HandleScript(), spell_sindragosa_icy_grip::HandleScript(), spell_the_lich_king_jump::HandleScript(), spell_the_lich_king_summon_spirit_bomb::HandleScript(), spell_dreamwalker_summon_portal::HandleScript(), spell_dreamwalker_twisted_nightmares::HandleScript(), spell_archavon_rock_shards::HandleScript(), spell_wintergrasp_portal::HandleScript(), spell_gen_create_lance::HandleScript(), spell_item_defibrillate::HandleScript(), spell_item_scroll_of_recall::HandleScript(), spell_shazzrah_gate_dummy::HandleScript(), spell_apothecary_lingering_fumes::HandleScript(), spell_apothecary_validate_area::HandleScript(), spell_apothecary_throw_cologne::HandleScript(), spell_apothecary_throw_perfume::HandleScript(), spell_hallows_end_trick::HandleScript(), spell_hallows_end_put_costume::HandleScript(), spell_hallows_end_trick_or_treat::HandleScript(), spell_winter_veil_mistletoe::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_moam_summon_mana_fiends::HandleScript(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), spell_mistress_kiss_area::HandleScript(), spell_novos_summon_minions::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_unbound_plague::HandleScript(), spell_putricide_choking_gas_bomb::HandleScript(), spell_rotface_little_ooze_combine::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_rotface_large_ooze_buff_combine::HandleScript(), spell_the_lich_king_cast_back_to_caster::HandleScript(), spell_frost_giant_death_plague::HandleScript(), spell_yogg_saron_target_selectors::HandleScript(), spell_the_black_stalker_levitate::HandleScript(), spell_the_black_stalker_levitation_pulse::HandleScript(), spell_the_black_stalker_someone_grab_me::HandleScript(), spell_the_black_stalker_magnetic_pull::HandleScript(), spell_the_flag_of_ownership::HandleScript(), spell_gen_elune_candle::HandleScript(), spell_gen_teleporting::HandleScript(), spell_gen_dalaran_disguise::HandleScript(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), spell_item_dimensional_ripper_area52::HandleScript(), spell_item_eggnog::HandleScript(), spell_q12735_song_of_cleansing::HandleScript(), spell_q13011_bear_flank_master::HandleScript(), spell_q12619_emblazon_runeblade_effect::HandleScript(), spell_q12919_gymers_grab::HandleScript(), spell_q12919_gymers_throw::HandleScript(), spell_q12641_death_comes_from_on_high_summon_ghouls::HandleScriptEffect(), spell_kalecgos_spectral_realm_dummy::HandleScriptEffect(), spell_marrowgar_coldflame_bonestorm::HandleScriptEffect(), spell_yogg_saron_sanity_reduce::HandleScriptEffect(), spell_black_temple_bloodbolt::HandleScriptEffect(), spell_lady_vashj_summon_sporebat::HandleScriptEffect(), spell_kaelthas_summon_weapons::HandleScriptEffect(), spell_kaelthas_gravity_lapse::HandleScriptEffect(), spell_kaelthas_nether_beam::HandleScriptEffect(), spell_gen_clone::HandleScriptEffect(), spell_gen_clone_weapon::HandleScriptEffect(), spell_gen_break_shield::HandleScriptEffect(), spell_gen_mounted_charge::HandleScriptEffect(), spell_gen_throw_shield::HandleScriptEffect(), spell_item_sleepy_willy::HandleScriptEffect(), spell_item_lil_xt::HandleScriptEffect(), spell_q12698_the_gift_that_keeps_on_giving::HandleScriptEffect(), spell_death_knight_initiate_visual::HandleScriptEffect(), spell_q12779_an_end_to_all_things::HandleScriptEffect(), spell_brewfest_toss_mug::HandleScriptEffect(), spell_direbrew_summon_mole_machine_target_picker::HandleScriptEffect(), spell_request_second_mug::HandleScriptEffect(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_winter_veil_shoot_air_rifle::HandleScriptEffect(), spell_dtk_summon_random_drakkari::HandleScriptEffect(), spell_marrowgar_coldflame::HandleScriptEffect(), spell_arcane_chains_character_force_cast::HandleScriptEffect(), spell_q12611_deathbolt::HandleScriptEffect(), spell_illidari_council_judgement::HandleScriptEffect(), spell_black_temple_summon_shadowfiends::HandleScriptEffect(), spell_ice_bombardment_dest_picker::HandleScriptEffect(), spell_kaelthas_remove_enchanted_weapons::HandleScriptEffect(), spell_kaelthas_kael_explodes::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_hun_masters_call::HandleScriptEffect(), spell_item_mirrens_drinking_hat::HandleScriptEffect(), spell_pal_judgement::HandleScriptEffect(), spell_pri_lightwell::HandleScriptEffect(), spell_q1846_bending_shinbone::HandleScriptEffect(), spell_q14112_14145_chum_the_water::HandleScriptEffect(), WorldSession::HandleSelfResOpcode(), AuraEffect::HandleShapeshiftBoosts(), ArenaSpectator::HandleSpectatorWatchCommand(), HandleSpellClick(), spell_marrowgar_bone_spike_graveyard::HandleSpikes(), AuraEffect::HandleSpiritOfRedemption(), spell_gen_paralytic_poison::HandleStun(), spell_putricide_mutated_transformation::HandleSummon(), spell_item_draenic_pale_ale::HandleSummon(), WorldSession::HandleTalentWipeConfirmOpcode(), spell_mother_shahraz_fatal_attraction::HandleTeleportUnits(), spell_warl_drain_soul::HandleTick(), WorldSession::HandleTrainerBuySpellOpcode(), spell_trigger_spell_from_caster::HandleTrigger(), spell_magic_eater_food::HandleTriggerSpell(), spell_winter_veil_racer_rocket_slam::HandleTriggerSpell(), spell_pal_righteous_defense::HandleTriggerSpellHit(), boss_onyxia::HandleWhelpSpam(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::HealReceived(), boss_ichoron::boss_ichoronAI::IchoronDoCastToAllHostilePlayers(), spell_q10769_dissension_amongst_the_ranks_aura::if(), CharmInfo::InitCharmCreateSpells(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::InitFight(), boss_urok_doomhowl::boss_urok_doomhowlAI::InitializeAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::InitializeAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::InitializeAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::InitializeAI(), boss_gal_darah::boss_gal_darahAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), npc_pet_pri_lightwell::InitializeAI(), CharmInfo::InitPossessCreateSpells(), Guardian::InitStatsForLevel(), Totem::InitSummon(), boss_faction_championsAI::IsCCed(), npc_living_inferno::npc_living_infernoAI::IsSummonedBy(), TriggerAI::IsSummonedBy(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_bone_spike::npc_bone_spikeAI::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_pet_gen_fetch_ball::IsSummonedBy(), npc_hallows_end_soh::JustDied(), boss_rajaxx::JustDied(), boss_black_knight::boss_black_knightAI::JustDied(), npc_swarm_scarab::npc_swarm_scarabAI::JustDied(), npc_phantom_hallucination::npc_phantom_hallucinationAI::JustDied(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::JustDied(), npc_gunship::npc_gunshipAI::JustDied(), boss_professor_putricide::boss_professor_putricideAI::JustDied(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::JustDied(), boss_steelbreaker::boss_steelbreakerAI::JustDied(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustDied(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustDied(), boss_freya_summons::boss_freya_summonsAI::JustDied(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vaporsAI::JustDied(), boss_yoggsaron_guardian_of_ys::boss_yoggsaron_guardian_of_ysAI::JustDied(), boss_skarvald_the_constructor::JustDied(), boss_dalronn_the_controller::JustDied(), npc_ichor_globule::npc_ichor_globuleAI::JustDied(), boss_fathomguard_sharkkis::JustDied(), boss_fathomguard_tidalvess::JustDied(), boss_fathomguard_caribdis::JustDied(), CombatAI::JustDied(), npc_high_inquisitor_valroth::npc_high_inquisitor_valrothAI::JustDied(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustDied(), boss_halion::boss_halionAI::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_tharon_ja::boss_tharon_jaAI::JustDied(), boss_sapphiron::boss_sapphironAI::JustDied(), boss_anomalus::JustDied(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), boss_shade_of_akama::JustDied(), CasterAI::JustEngagedWith(), boss_servant_quarters::JustEngagedWith(), npc_mograine::npc_mograineAI::JustEngagedWith(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::JustEngagedWith(), boss_akilzon::JustEngagedWith(), npc_hallows_end_soh::JustEngagedWith(), boss_eadric::boss_eadricAI::JustEngagedWith(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::JustEngagedWith(), boss_twin_valkyrAI::JustEngagedWith(), boss_garfrost::boss_garfrostAI::JustEngagedWith(), npc_stinky_icc::npc_stinky_iccAI::JustEngagedWith(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::JustEngagedWith(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::JustEngagedWith(), npc_rimefang::npc_rimefangAI::JustEngagedWith(), boss_urom::boss_uromAI::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), boss_freya_summons::boss_freya_summonsAI::JustEngagedWith(), boss_vezax::boss_vezaxAI::JustEngagedWith(), boss_hodir::boss_hodirAI::JustEngagedWith(), boss_thorim::boss_thorimAI::JustEngagedWith(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::JustEngagedWith(), boss_koralon::boss_koralonAI::JustEngagedWith(), boss_toravon::boss_toravonAI::JustEngagedWith(), boss_ichoron::boss_ichoronAI::JustEngagedWith(), boss_moragg::boss_moraggAI::JustEngagedWith(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::JustEngagedWith(), boss_watchkeeper_gargolmar::JustEngagedWith(), boss_gatewatcher_gyrokill::JustEngagedWith(), boss_pathaleon_the_calculator::JustEngagedWith(), npc_pet_shaman_fire_elemental::JustEngagedWith(), boss_sartharion::boss_sartharionAI::JustEngagedWith(), CombatAI::JustEngagedWith(), boss_yauj::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_moorabi::boss_moorabiAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::JustEngagedWith(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), boss_sapphiron::boss_sapphironAI::JustEngagedWith(), boss_keristrasza::JustEngagedWith(), boss_steelbreaker::boss_steelbreakerAI::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_fathomlord_karathress::JustEngagedWith(), boss_fathomguard_sharkkis::JustEngagedWith(), npc_artorius::npc_artoriusAI::JustEngagedWith(), npc_simone::npc_simoneAI::JustEngagedWith(), npc_nelson::npc_nelsonAI::JustEngagedWith(), npc_franklin::npc_franklinAI::JustEngagedWith(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustReachedHome(), boss_bronjahm::boss_bronjahmAI::JustReachedHome(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustReachedHome(), boss_gal_darah::boss_gal_darahAI::JustReachedHome(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::JustReachedHome(), boss_freya::boss_freyaAI::JustSummoned(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_skeram::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), boss_ragnaros::boss_ragnarosAI::JustSummoned(), boss_vexallus::JustSummoned(), boss_kiljaeden::JustSummoned(), npc_kalecgos_kj::JustSummoned(), boss_jindo::JustSummoned(), npc_medivh_bm::JustSummoned(), boss_taldaram::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_halion::boss_halionAI::JustSummoned(), boss_gal_darah::boss_gal_darahAI::JustSummoned(), boss_prince_valanar_icc::boss_prince_valanarAI::JustSummoned(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::JustSummoned(), boss_malygos::boss_malygosAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_svala::boss_svalaAI::JustSummoned(), boss_shirrak_the_dead_watcher::JustSummoned(), boss_nexusprince_shaffar::JustSummoned(), boss_grandmaster_vorpil::JustSummoned(), boss_gurtogg_bloodboil::JustSummoned(), boss_veras_darkshadow::JustSummoned(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::JustSummoned(), boss_supremus::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), npc_deaths_door_fell_cannon_target_bunny::npc_deaths_door_fell_cannon_target_bunnyAI::JustSummoned(), boss_ayamiss::JustSummoned(), Kill(), boss_azuregos::boss_azuregosAI::KilledUnit(), boss_anubrekhan::boss_anubrekhanAI::KilledUnit(), boss_doomwalker::KilledUnit(), npc_dark_iron_guzzler::KilledUnit(), boss_steelbreaker::boss_steelbreakerAI::KilledUnit(), emerald_dragonAI::KilledUnit(), boss_emeriss::boss_emerissAI::KilledUnit(), boss_felblood_kaelthas::LapseAction(), spell_mandokir_charge::LaunchHit(), Player::learnQuestRewardedSpells(), spell_taldaram_summon_flame_ball::Load(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), npc_fairbanks::npc_fairbanksAI::MoveInLineOfSight(), npc_brewfest_keg_thrower::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_love_in_air_snivel::MoveInLineOfSight(), boss_temporus::MoveInLineOfSight(), npc_medivh_bm::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_spirit_shade::npc_spirit_shadeAI::MovementInform(), npc_unworthy_initiate::npc_unworthy_initiateAI::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_eck::boss_eckAI::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::MovementInform(), boss_malygos::boss_malygosAI::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::MovementInform(), boss_headless_horseman::MovementInform(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::MovementInform(), npc_ashtongue_sorcerer::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::MovementInform(), npc_wild_wyrm::npc_wild_wyrmAI::MovementInform(), boss_kagani_nightstrike::MovementInform(), npc_dark_iron_guzzler::MovementInform(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_assembly_lightning::npc_assembly_lightningAI::MovementInform(), boss_ymiron::boss_ymironAI::MovementInform(), boss_icehowl::boss_icehowlAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), BattlegroundAB::NodeOccupied(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::npc_algalon_worm_holeAI(), npc_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_collapsing_star::npc_collapsing_starAI::npc_collapsing_starAI(), npc_concentrated_ball::npc_concentrated_ballAI::npc_concentrated_ballAI(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_frost_tomb::npc_frost_tomb(), npc_hallows_end_soh::npc_hallows_end_soh(), npc_hol_monument::npc_hol_monumentAI::npc_hol_monumentAI(), npc_midsummer_torch_target::npc_midsummer_torch_target(), npc_power_spark::npc_power_sparkAI::npc_power_sparkAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::npc_ulduar_iron_constructAI(), npc_ulduar_toasty_fire::npc_ulduar_toasty_fireAI::npc_ulduar_toasty_fireAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), spell_shadowfang_keep_forsaken_skills_aura::OnApply(), spell_direbrew_disarm::OnApply(), spell_love_is_in_the_air_romantic_picnic::OnApply(), spell_halion_combustion_consumption_aura::OnApply(), spell_load_into_catapult_aura::OnApply(), spell_gen_damage_reduction_aura::OnApply(), spell_gruul_ground_slam_trigger::OnApply(), spell_hun_ascpect_of_the_viper::OnApply(), spell_hun_viper_attack_speed::OnApply(), spell_item_with_mount_speed::OnApply(), spell_blood_queen_vampiric_bite::OnCast(), npc_chesspiece::OnCharmed(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), BattlefieldWG::OnCreatureCreate(), instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_item_linken_boomerang::OnEffectLaunchTargetDisarm(), spell_item_linken_boomerang::OnEffectLaunchTargetStun(), npc_essence_of_twin::OnGossipHello(), npc_alchemist_adrianna::OnGossipHello(), go_inconspicuous_mine_car::OnGossipHello(), go_manticron_cube::OnGossipHello(), go_noblegarden_colored_egg::OnGossipHello(), go_seer_of_zebhalak::OnGossipHello(), go_jump_a_tron::OnGossipHello(), go_orb_of_domination::OnGossipHello(), go_scourge_enclosure::OnGossipHello(), go_strange_pool::OnGossipHello(), go_simon_cluster::OnGossipHello(), go_tablet_of_the_seven::OnGossipHello(), go_arcane_prison::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), npc_steward_of_time::OnGossipSelect(), npc_iruk::OnGossipSelect(), npc_zephyr::OnGossipSelect(), npc_taxi::OnGossipSelect(), npc_locksmith::OnGossipSelect(), npc_engineering_tele_trinket::OnGossipSelect(), npc_sayge::OnGossipSelect(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_lokhtos_darkbargainer::OnGossipSelect(), boss_gloomrel::OnGossipSelect(), npc_death_knight_initiate::OnGossipSelect(), npc_parqual_fintallas::OnGossipSelect(), npcs_riverbreeze_and_silversky::OnGossipSelect(), npc_braug_dimspirit::OnGossipSelect(), npc_avatar_of_freya::OnGossipSelect(), npc_adventurous_dwarf::OnGossipSelect(), npc_wg_demolisher_engineer::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), npc_wormhole::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), icecrown_citadel_teleport::OnGossipSelect(), go_amberpine_outhouse::OnGossipSelect(), go_fel_crystalforge::OnGossipSelect(), go_bashir_crystalforge::OnGossipSelect(), go_apexis_relic::OnGossipSelect(), Player::OnGossipSelect(), lfg::LFGPlayerScript::OnMapChanged(), spell_apothecary_perfume_spill::OnPeriodic(), spell_apothecary_cologne_spill::OnPeriodic(), spell_muru_summon_blood_elves_periodic_aura::OnPeriodic(), spell_claw_rage_aura::OnPeriodic(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_anubisath_mortal_strike::OnPeriodic(), spell_the_lich_king_soul_reaper_aura::OnPeriodic(), spell_yogg_saron_brain_link_aura::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), spell_illidan_tear_of_azzinoth_summon_channel_aura::OnPeriodic(), spell_illidan_demon_transform1_aura::OnPeriodic(), spell_illidan_cage_trap_stun_aura::OnPeriodic(), spell_black_temple_dementia_aura::OnPeriodic(), spell_npc22275_crystal_prison_aura::OnPeriodic(), spell_item_eye_of_grillok_aura::OnPeriodic(), spell_muru_darkness_aura::OnPeriodic(), spell_mark_of_kazrogal_aura::OnPeriodic(), spell_the_lich_king_vile_spirits_aura::OnPeriodic(), spell_web_wrap_damage::OnPeriodic(), spell_assembly_rune_of_summoning_aura::OnPeriodic(), spell_thorim_lightning_pillar_P2_aura::OnPeriodic(), spell_illidan_demon_transform2_aura::OnPeriodic(), spell_mark_of_kazzak_aura::OnPeriodic(), spell_karathress_power_of_tidalvess::OnPeriodic(), spell_karathress_power_of_caribdis::OnPeriodic(), spell_leotheras_demon_link::OnPeriodic(), spell_lurker_below_spout::OnPeriodic(), spell_gen_periodic_knock_away::OnPeriodic(), spell_gen_turkey_marker::OnPeriodic(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnPlayerEnter(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::OnPlayerInWaterStateUpdate(), BattlefieldWG::OnPlayerJoinWar(), npc_steward_of_time::OnQuestAccept(), npc_mikhail::OnQuestAccept(), npc_rocknot::OnQuestReward(), npc_thrall_bfu::OnQuestReward(), spell_kalecgos_spectral_realm_aura::OnRemove(), spell_azgalor_doom_aura::OnRemove(), spell_boss_salramm_steal_flesh_aura::OnRemove(), spell_azjol_nerub_web_wrap_aura::OnRemove(), spell_putricide_mutation_init_aura::OnRemove(), spell_the_lich_king_shadow_trap_visual_aura::OnRemove(), spell_the_lich_king_harvest_soul_aura::OnRemove(), spell_icc_web_wrap_aura::OnRemove(), spell_ioc_repair_turret_aura::OnRemove(), spell_kaelthas_flame_strike::OnRemove(), spell_item_goblin_weather_machine_aura::OnRemove(), spell_warl_curse_of_doom::OnRemove(), boss_yoggsaron_descend_portal::boss_yoggsaron_descend_portalAI::OnSpellClick(), spell_item_shadowmourne_soul_fragment::OnStackChange(), at_hor_battered_hilt_throw::OnTrigger(), at_frozen_throne_teleport::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), AreaTrigger_at_stormwright_shelf::OnTrigger(), MidsummerPlayerScript::OnUpdateZone(), npc_wintergarde_gryphon::PassengerBoarded(), npc_four_car_garage::npc_four_car_garageAI::PassengerBoarded(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), spell_quest_test_flight_charging::PerformKick(), spell_send_mug_control_aura::PeriodicTick(), spell_barreled_control_aura::PeriodicTick(), spell_dreamwalker_summon_suppresser_aura::PeriodicTick(), spell_summon_ice_spear_delayer::PeriodicTick(), spell_summoning_rhyme_aura::PeriodicTick(), spell_halion_twilight_phasing::Phase(), Battlefield::PlayerAskToLeave(), BattlegroundAV::PopulateNode(), spell_azjol_nerub_carrion_beetels::PrepareAuraScript(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11653_youre_not_so_big_now::PrepareSpellScript(), spell_q13369_fate_up_against_your_will::PrepareSpellScript(), SmartScript::ProcessAction(), ProcessCastaction(), Player::ProcessDelayedOperations(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::ProcessEvent(), ProcessTerrainStatusUpdate(), ProcessUnlearnAction(), BattlefieldWG::PromotePlayer(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), spell_gen_defend::RefreshVisualShields(), Vehicle::RemovePassenger(), spell_igb_below_zero::RemovePassengers(), boss_keristrasza::RemovePrison(), Player::ReportedAfkBy(), GuardAI::Reset(), npc_demonic_vapor::Reset(), npc_demonic_vapor_trail::Reset(), npc_batrider::Reset(), npc_dark_iron_guzzler::Reset(), boss_headless_horseman_pumpkin::Reset(), npc_taretha::npc_tarethaAI::Reset(), npc_medivh_bm::Reset(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::Reset(), boss_halion::boss_halionAI::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), npc_nerubian_burrower::npc_nerubian_burrowerAI::Reset(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_bronjahm::boss_bronjahmAI::Reset(), boss_drakkari_elemental::boss_drakkari_elementalAI::Reset(), npc_dark_nucleus::npc_dark_nucleusAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), boss_sindragosa::boss_sindragosaAI::Reset(), npc_raging_spirit::npc_raging_spiritAI::Reset(), boss_noth::boss_nothAI::Reset(), boss_anomalus::Reset(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_bjarngrim::boss_bjarngrimAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_freya_lifebinder::boss_freya_lifebinderAI::Reset(), boss_freya_healthy_spore::boss_freya_healthy_sporeAI::Reset(), boss_freya_nature_bomb::boss_freya_nature_bombAI::Reset(), boss_thorim_lightning_orb::boss_thorim_lightning_orbAI::Reset(), boss_thorim_sif_blizzard::boss_thorim_sif_blizzardAI::Reset(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::Reset(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_yoggsaron_voice::boss_yoggsaron_voiceAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_frozen_orb::npc_frozen_orbAI::Reset(), npc_frozen_orb_stalker::npc_frozen_orb_stalkerAI::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::Reset(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::Reset(), npc_storm_cloud::npc_storm_cloudAI::Reset(), npc_ashtongue_channeler::Reset(), npc_warden_mellichar::npc_warden_mellicharAI::Reset(), boss_wrath_scryer_soccothrates::Reset(), npc_training_dummy::npc_training_dummyAI::Reset(), BfGraveyard::Resurrect(), Resurrect(), Player::ResurrectPlayer(), Player::RewardQuest(), boss_bjarngrim::boss_bjarngrimAI::RollStance(), boss_nightbane::ScheduleFly(), boss_the_lurker_below::SchedulerPhaseOne(), Map::ScriptsProcess(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::SelectT(), npc_sayge::SendAction(), go_skull_pile::SendActionMenu(), npc_xt002_heart::npc_xt002_heartAI::SendEnergyToCorner(), Player::SendInitialPacketsAfterAddToMap(), Player::SendQuestUpdate(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), npc_eastvale_peasent::SetData(), SetModelVisible(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_simon_bunny::npc_simon_bunnyAI::SetUpPreGame(), npc_stable_master::npc_stable_masterAI::sGossipSelect(), npc_brewfest_keg_reciver::sGossipSelect(), npc_cairne_bloodhoof::npc_cairne_bloodhoofAI::sGossipSelect(), npc_chesspiece::sGossipSelect(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::sGossipSelect(), npc_zafod_boombox::npc_zafod_boomboxAI::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), boss_hodir::boss_hodirAI::SmallIcicles(), boss_skadi_grauf::boss_skadi_graufAI::SpawnFlameTriggers(), boss_malchezaar::SpawnInfernal(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SpellHit(), boss_eadric::boss_eadricAI::SpellHit(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_ichor_globule::npc_ichor_globuleAI::SpellHit(), npc_vics_flying_machine::npc_vics_flying_machineAI::SpellHit(), npc_franklin::npc_franklinAI::SpellHit(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::SpellHit(), npc_dark_iron_guzzler::SpellHit(), boss_headless_horseman::SpellHit(), boss_thorim_pillar::boss_thorim_pillarAI::SpellHit(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), boss_jaraxxus::boss_jaraxxusAI::SpellHit(), npc_living_constellation::npc_living_constellationAI::SpellHit(), boss_ignis::boss_ignisAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit(), npc_storm_cloud::npc_storm_cloudAI::SpellHit(), npc_soh_fire_trigger::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_midsummer_torch_target::SpellHit(), boss_magus_telestra::SpellHit(), boss_thorim::boss_thorimAI::SpellHit(), npc_iron_watcher::npc_iron_watcherAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_bronjahm::boss_bronjahmAI::SpellHitTarget(), npc_demonic_vapor_trail::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_rotface::boss_rotfaceAI::SpellHitTarget(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), boss_hodir::boss_hodirAI::SpellHitTarget(), npc_ulduar_rocket_strike_trigger::npc_ulduar_rocket_strike_triggerAI::SpellHitTarget(), npc_q24545_lich_king::npc_q24545_lich_kingAI::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), boss_epoch::boss_epochAI::SpellHitTarget(), boss_sapphiron::boss_sapphironAI::SpellHitTarget(), boss_skadi_grauf::boss_skadi_graufAI::SpellHitTarget(), boss_shirrak_the_dead_watcher::SpellHitTarget(), npc_pet_gen_soul_trader_beacon::SpellHitTarget(), Battleground::SpiritOfCompetitionEvent(), boss_ionar::boss_ionarAI::Split(), boss_heigan::boss_heiganAI::StartFightPhase(), boss_felmyst::StartIntro(), npc_finklestein::npc_finklesteinAI::StartNextTask(), Player::StoreItem(), spell_dk_ghoul_explode::Suicide(), boss_anzu::SummonBroods(), boss_anubrekhan::boss_anubrekhanAI::SummonedCreatureDies(), boss_cthun::SummonedCreatureDies(), boss_vexallus::SummonedCreatureDies(), boss_paletress::boss_paletressAI::SummonMemory(), go_wind_stone::go_wind_stoneAI::SummonNPC(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), spell_igb_check_for_players::TeleportPlayer(), BattlegroundSA::TeleportToEntrancePosition(), spell_midsummer_fling_torch::ThrowNextTorch(), TriggerBurningPitch(), npc_orb_carrier::npc_orb_carrierAI::TriggerCutter(), spell_koralon_meteor_fists_aura::TriggerFists(), spell_flame_warder_meteor_fists_aura::TriggerFists(), spell_gen_holiday_buff_food::TriggerFoodBuff(), spell_karazhan_brittle_bones_aura::Update(), spell_black_temple_curse_of_the_bleakheart_aura::Update(), spell_illidari_council_deadly_strike_aura::Update(), spell_mother_shahraz_random_periodic_aura::Update(), spell_mother_shahraz_beam_periodic_aura::Update(), spell_mother_shahraz_saber_lash_aura::Update(), spell_black_temple_charge_rage_aura::Update(), Pet::Update(), GameObject::Update(), TotemAI::UpdateAI(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_image_of_medivh::npc_image_of_medivhAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_demonic_vapor_trail::UpdateAI(), npc_kalecgos_kj::UpdateAI(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_wushoolay::boss_wushoolayAI::UpdateAI(), npc_dark_iron_guzzler::UpdateAI(), npc_brewfest_super_brew_trigger::UpdateAI(), npc_hallows_end_train_fire::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_headless_horseman_head::UpdateAI(), boss_headless_horseman_pumpkin::UpdateAI(), npc_love_in_air_snivel_real::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_meathook::boss_meathookAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_medivh_bm::UpdateAI(), npc_time_rift::UpdateAI(), boss_onyxia::UpdateAI(), boss_skeram::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_tharnarian::npc_tharnarianAI::UpdateAI(), boss_taldaram::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_krik_thir::boss_krik_thirAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), npc_halion_controller::npc_halion_controllerAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_eadric::boss_eadricAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_swarm_scarab::npc_swarm_scarabAI::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_toc_druid::npc_toc_druidAI::UpdateAI(), npc_toc_shaman::npc_toc_shamanAI::UpdateAI(), npc_toc_paladin::npc_toc_paladinAI::UpdateAI(), npc_toc_priest::npc_toc_priestAI::UpdateAI(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::UpdateAI(), npc_toc_warlock::npc_toc_warlockAI::UpdateAI(), npc_toc_mage::npc_toc_mageAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), npc_toc_boomkin::npc_toc_boomkinAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::UpdateAI(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::UpdateAI(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::UpdateAI(), npc_toc_pet_hunter::npc_toc_pet_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_ghostly_priest::npc_ghostly_priestAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), boss_frostsworn_general::boss_frostsworn_generalAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), npc_pos_icicle_trigger::npc_pos_icicle_triggerAI::UpdateAI(), npc_pos_collapsing_icicle::npc_pos_collapsing_icicleAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), npc_spirit_warden::npc_spirit_wardenAI::UpdateAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_faerlina::boss_faerlinaAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::UpdateAI(), boss_heigan::boss_heiganAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_loatheb::boss_loathebAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_naxxramas_misc::boss_naxxramas_miscAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), npc_scion_of_eternity::npc_scion_of_eternityAI::UpdateAI(), npc_alexstrasza::npc_alexstraszaAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), npc_crystal_spike::UpdateAI(), npc_crystalline_frayer::UpdateAI(), boss_drakos::boss_drakosAI::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_sjonnir::boss_sjonnirAI::UpdateAI(), boss_sjonnir_iron_sludge::boss_sjonnir_iron_sludgeAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::UpdateAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_lifebinder::boss_freya_lifebinderAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_freya_nature_bomb::boss_freya_nature_bombAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_saronite_animus::npc_ulduar_saronite_animusAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), npc_ulduar_icicle::npc_ulduar_icicleAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), npc_ulduar_proximity_mine::npc_ulduar_proximity_mineAI::UpdateAI(), npc_ulduar_emergency_fire_bot::npc_ulduar_emergency_fire_botAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_watcher::npc_ulduar_dark_rune_watcherAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_thorim_trap::boss_thorim_trapAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), npc_xt002_pummeller::npc_xt002_pummellerAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron_guardian_of_ys::boss_yoggsaron_guardian_of_ysAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_dalronn_the_controller::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_massive_jormungar::npc_massive_jormungarAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), boss_zuramat::boss_zuramatAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_azure_saboteur::npc_azure_saboteurAI::UpdateAI(), npc_beryl_sorcerer::npc_beryl_sorcererAI::UpdateAI(), npc_thassarian::npc_thassarianAI::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::UpdateAI(), npc_jungle_punch_target::npc_jungle_punch_targetAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_wg_queue::npc_wg_queueAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_lady_malande::UpdateAI(), boss_the_lurker_below::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_invis_infernal_caster::npc_invis_infernal_casterAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::UpdateAI(), npc_pet_gen_soul_trader_beacon::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), trigger_periodic::trigger_periodicAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), npc_orb_carrier::npc_orb_carrierAI::UpdateAI(), npc_hor_raging_ghoul::npc_hor_raging_ghoulAI::UpdateAI(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), boss_maexxna_webwrap::boss_maexxna_webwrapAI::UpdateAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::UpdateAI(), npc_q24545_vegard_dummy::npc_q24545_vegard_dummyAI::UpdateAI(), Player::UpdateAreaDependentAuras(), Player::UpdateCharmedAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdatePhase(), Player::UpdateZoneDependentAuras(), GameObject::Use(), Player::VehicleSpellInitialize(), boss_bjarngrim::boss_bjarngrimAI::WaypointReached(), npc_arthas::npc_arthasAI::WaypointReached(), and npc_engineer_helice::npc_engineer_heliceAI::WaypointReached().

◆ CastSpell() [4/7]

SpellCastResult Unit::CastSpell ( Unit victim,
SpellInfo const *  spellInfo,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1213{
1214 return CastSpell(victim, spellInfo, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1215}

References CastSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [5/7]

SpellCastResult Unit::CastSpell ( Unit victim,
SpellInfo const *  spellInfo,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1218{
1219 SpellCastTargets targets;
1220 targets.SetUnitTarget(victim);
1221 return CastSpell(targets, spellInfo, nullptr, triggerFlags, castItem, triggeredByAura, originalCaster);
1222}

References CastSpell(), and SpellCastTargets::SetUnitTarget().

◆ CastSpell() [6/7]

SpellCastResult Unit::CastSpell ( Unit victim,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1196{
1197 return CastSpell(victim, spellId, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1198}

References CastSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [7/7]

SpellCastResult Unit::CastSpell ( Unit victim,
uint32  spellId,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1201{
1202 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1203 if (!spellInfo)
1204 {
1205 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1207 }
1208
1209 return CastSpell(victim, spellInfo, triggerFlags, castItem, triggeredByAura, originalCaster);
1210}

References CastSpell(), Object::GetGUID(), LOG_ERROR, SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, and Position::ToString().

◆ CastStop()

◆ ChangeSeat()

void Unit::ChangeSeat ( int8  seatId,
bool  next = true 
)
19718{
19719 if (!m_vehicle)
19720 return;
19721
19722 if (seatId < 0)
19723 {
19724 seatId = m_vehicle->GetNextEmptySeat(GetTransSeat(), next);
19725 if (seatId < 0)
19726 return;
19727 }
19728 else if (seatId == GetTransSeat() || !m_vehicle->HasEmptySeat(seatId))
19729 return;
19730
19732 if (!m_vehicle->AddPassenger(this, seatId))
19733 ABORT();
19734}
int8 GetNextEmptySeat(int8 seatId, bool next) const
Definition: Vehicle.cpp:245
bool HasEmptySeat(int8 seatId) const
Definition: Vehicle.cpp:219

References ABORT, Vehicle::AddPassenger(), Vehicle::GetNextEmptySeat(), WorldObject::GetTransSeat(), Vehicle::HasEmptySeat(), m_vehicle, and Vehicle::RemovePassenger().

Referenced by _EnterVehicle(), and WorldSession::HandleChangeSeatsOnControlledVehicle().

◆ CleanupBeforeRemoveFromMap()

void Unit::CleanupBeforeRemoveFromMap ( bool  finalCleanup)
15743{
15745 return;
15746
15747 // This needs to be before RemoveFromWorld to make GetCaster() return a valid pointer on aura removal
15749
15750 if (IsInWorld()) // not in world and not being removed atm
15752
15753 ASSERT(GetGUID());
15754
15755 // A unit may be in removelist and not in world, but it is still in grid
15756 // and may have some references during delete
15759
15760 if (finalCleanup)
15761 m_cleanupDone = true;
15762
15763 m_Events.KillAllEvents(false); // non-delatable (currently casted spells) will not deleted now but it will deleted at call in Map::RemoveAllObjectsInRemoveList
15764 CombatStop();
15769 GetMotionMaster()->Clear(false); // remove different non-standard movement generators.
15770}
void KillAllEvents(bool force)
Definition: EventProcessor.cpp:82
void deleteReferences(bool removeFromMap=false)
Definition: HostileRefMgr.cpp:125
void ClearAllThreat()
Definition: ThreatMgr.cpp:417
void CombatStop(bool includingCast=false)
Definition: Unit.cpp:10436
void RemoveAllGameObjects()
Definition: Unit.cpp:6263
void ClearComboPoints()
Definition: Unit.cpp:16865
void ClearComboPointHolders()
Definition: Unit.cpp:16920
HostileRefMgr & getHostileRefMgr()
Definition: Unit.h:907
void RemoveFromWorld() override
Definition: Unit.cpp:15696
void RemoveAllAuras()
Definition: Unit.cpp:5319
ThreatMgr & GetThreatMgr()
Definition: Unit.h:903
void Clear(bool reset=true)
Definition: MotionMaster.h:167

References ASSERT, MotionMaster::Clear(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearComboPoints(), CombatStop(), HostileRefMgr::deleteReferences(), Object::GetGUID(), getHostileRefMgr(), GetMotionMaster(), GetThreatMgr(), InterruptNonMeleeSpells(), IsDuringRemoveFromWorld(), Object::IsInWorld(), EventProcessor::KillAllEvents(), m_cleanupDone, m_Events, RemoveAllAuras(), RemoveAllGameObjects(), and RemoveFromWorld().

Referenced by CleanupsBeforeDelete().

◆ CleanupsBeforeDelete()

void Unit::CleanupsBeforeDelete ( bool  finalCleanup = true)
overridevirtual

Reimplemented from WorldObject.

15773{
15774 if (GetTransport())
15775 {
15777 SetTransport(nullptr);
15780 }
15781
15782 CleanupBeforeRemoveFromMap(finalCleanup);
15783}
void RemoveMovementFlag(uint32 flag)
Definition: Object.h:333
void Reset()
Definition: Object.h:287
void SetTransport(Transport *t)
Definition: Object.h:607
virtual void RemovePassenger(WorldObject *passenger, bool withAll=false)=0
void CleanupBeforeRemoveFromMap(bool finalCleanup)
Definition: Unit.cpp:15742

References CleanupBeforeRemoveFromMap(), WorldObject::GetTransport(), WorldObject::m_movementInfo, MOVEMENTFLAG_ONTRANSPORT, MovementInfo::RemoveMovementFlag(), Transport::RemovePassenger(), MovementInfo::TransportInfo::Reset(), WorldObject::SetTransport(), and MovementInfo::transport.

Referenced by Player::CleanupsBeforeDelete(), npc_commandscript::HandleNpcAddCommand(), and Map::RemoveAllObjectsInRemoveList().

◆ ClearAllReactives()

void Unit::ClearAllReactives ( )
16929{
16930 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
16931 m_reactiveTimer[i] = 0;
16932
16939}
@ CLASS_HUNTER
Definition: SharedDefines.h:143
@ CLASS_WARRIOR
Definition: SharedDefines.h:141
@ AURA_STATE_DEFENSE
Definition: SharedDefines.h:1292
@ AURA_STATE_HUNTER_PARRY
Definition: SharedDefines.h:1298
@ CLASS_CONTEXT_ABILITY_REACTIVE
Definition: UnitDefines.h:214
virtual bool IsClass(Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
Definition: Unit.h:801
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition: Unit.cpp:10547

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), HasAuraState(), IsClass(), Object::IsPlayer(), m_reactiveTimer, MAX_REACTIVE, and ModifyAuraState().

Referenced by Player::ActivateSpec(), npc_mograine::npc_mograineAI::DamageTaken(), and setDeathState().

◆ ClearComboPointHolders()

void Unit::ClearComboPointHolders ( )
16921{
16922 while (!m_ComboPointHolders.empty())
16923 {
16924 (*m_ComboPointHolders.begin())->ClearComboPoints(); // this also removes it from m_comboPointHolders
16925 }
16926}

References ClearComboPoints(), and m_ComboPointHolders.

Referenced by CreatureAI::_EnterEvadeMode(), CleanupBeforeRemoveFromMap(), npc_mograine::npc_mograineAI::DamageTaken(), Player::RemoveFromWorld(), and setDeathState().

◆ ClearComboPoints()

void Unit::ClearComboPoints ( )
16866{
16867 if (!m_comboTarget)
16868 {
16869 return;
16870 }
16871
16872 // remove Premed-like effects
16873 // (NB: this Aura retains the CP while it's active - now that CP have reset, it shouldn't be there anymore)
16875
16876 m_comboPoints = 0;
16879 m_comboTarget = nullptr;
16880}
@ SPELL_AURA_RETAIN_COMBO_POINTS
Definition: SpellAuraDefines.h:211

References m_comboPoints, m_comboTarget, RemoveAurasByType(), RemoveComboPointHolder(), SendComboPoints(), and SPELL_AURA_RETAIN_COMBO_POINTS.

Referenced by Spell::_handle_finish_phase(), CleanupBeforeRemoveFromMap(), ClearAllReactives(), ClearComboPointHolders(), Player::DuelComplete(), Player::RemoveFromWorld(), Player::setDeathState(), and UpdateReactives().

◆ ClearDiminishings()

void Unit::ClearDiminishings ( )
inline
1723{ m_Diminishing.clear(); }

References m_Diminishing.

Referenced by setDeathState().

◆ ClearInCombat()

void Unit::ClearInCombat ( )
13810{
13811 m_CombatTimer = 0;
13813
13814 // Player's state will be cleared in Player::UpdateContestedPvP
13815 if (Creature* creature = ToCreature())
13816 {
13817 if (creature->GetCreatureTemplate() && creature->GetCreatureTemplate()->unit_flags & UNIT_FLAG_IMMUNE_TO_PC)
13818 SetImmuneToPC(true); // set immunity state to the one from db on evade
13819
13822 ReplaceAllDynamicFlags(creature->GetCreatureTemplate()->dynamicflags);
13823
13824 creature->SetAssistanceTimer(0);
13825
13826 // Xinef: will be recalculated at follow movement generator initialization
13827 if (!IsPet() && !IsCharmed())
13828 return;
13829 }
13830 else if (Player* player = ToPlayer())
13831 {
13832 player->UpdatePotionCooldown();
13833 if (player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
13834 for (uint8 i = 0; i < MAX_RUNES; ++i)
13835 player->SetGracePeriod(i, 0);
13836 }
13837
13838 if (Player* player = this->ToPlayer())
13839 {
13840 sScriptMgr->OnPlayerLeaveCombat(player);
13841 }
13842}
@ CLASS_DEATH_KNIGHT
Definition: SharedDefines.h:146
#define MAX_RUNES
Definition: Player.h:398
@ CLASS_CONTEXT_ABILITY
Definition: UnitDefines.h:213
@ UNIT_STATE_ATTACK_PLAYER
Definition: UnitDefines.h:163
@ UNIT_FLAG_IN_COMBAT
Definition: UnitDefines.h:248
@ UNIT_FLAG_IMMUNE_TO_PC
Definition: UnitDefines.h:237
void ReplaceAllDynamicFlags(uint32 flag) override
Definition: Unit.h:731
bool IsCharmed() const
Definition: Unit.h:1235
bool IsPet() const
Definition: Unit.h:754
void SetImmuneToPC(bool apply, bool keepCombat=false)
Definition: Unit.cpp:13611
void RemoveUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition: Unit.h:714

References CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, ClearUnitState(), Object::HasDynamicFlag(), IsCharmed(), IsPet(), m_CombatTimer, MAX_RUNES, RemoveUnitFlag(), ReplaceAllDynamicFlags(), SetImmuneToPC(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_DYNFLAG_TAPPED, UNIT_FLAG_IMMUNE_TO_PC, UNIT_FLAG_IN_COMBAT, and UNIT_STATE_ATTACK_PLAYER.

Referenced by CombatStop(), Player::LoadFromDB(), and Update().

◆ ClearInPetCombat()

◆ ClearUnitState()

void Unit::ClearUnitState ( uint32  f)
inline
702{ m_state &= ~f; }

References m_state.

Referenced by Spell::_cast(), HomeMovementGenerator< Creature >::_setTargetLocation(), Attack(), FollowerAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), AttackStop(), ClearInCombat(), boss_thorim::boss_thorimAI::DisableThorim(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), HomeMovementGenerator< Creature >::DoFinalize(), WaypointMovementGenerator< Creature >::DoFinalize(), RandomMovementGenerator< T >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), RandomMovementGenerator< T >::DoUpdate(), FollowMovementGenerator< T >::DoUpdate(), Spell::EffectResurrectPet(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_ayamiss::EnterEvadeMode(), SmartAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_future_you::npc_future_youAI::EnterEvadeMode(), TimedFleeingMovementGenerator::Finalize(), RotateMovementGenerator::Finalize(), DistractMovementGenerator::Finalize(), AssistanceDistractMovementGenerator::Finalize(), Spell::finish(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraModSchoolImmunity(), debug_commandscript::HandleDebugUnitStateCommand(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetCastSpellOpcode(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), SmartAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), MotionMaster::MoveTargetedHome(), WaypointMovementGenerator< Creature >::OnArrived(), boss_nightbane::PathEndReached(), Creature::ReleaseFocus(), RemoveCharmedBy(), MotionTransport::RemovePassenger(), boss_ayamiss::Reset(), boss_hungarfen::Reset(), Player::ResetContestedPvP(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Player::SetClientControl(), SetControlled(), Creature::setDeathState(), Player::setDeathState(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), Player::SetIsSpectator(), boss_urom::boss_uromAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), StopMoving(), StopMovingOnCurrentPos(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), and boss_the_lich_king::boss_the_lich_kingAI::UpdateAI().

◆ CombatStart()

void Unit::CombatStart ( Unit target,
bool  initialAggro = true 
)
13630{
13631 // Xinef: Dont allow to start combat with triggers
13632 if (victim->IsCreature() && victim->ToCreature()->IsTrigger())
13633 return;
13634
13635 if (initialAggro)
13636 {
13637 // Make player victim stand up automatically
13638 if (victim->getStandState() && victim->IsPlayer())
13639 {
13640 victim->SetStandState(UNIT_STAND_STATE_STAND);
13641 }
13642
13643 if (!victim->IsInCombat() && !victim->IsPlayer() && !victim->ToCreature()->HasReactState(REACT_PASSIVE) && victim->ToCreature()->IsAIEnabled)
13644 {
13645 if (victim->IsPet())
13646 victim->ToCreature()->AI()->AttackedBy(this); // PetAI has special handler before AttackStart()
13647 else
13648 {
13649 victim->ToCreature()->AI()->AttackStart(this);
13650 // if the target is an NPC with a pet or minion, pet should react.
13651 if (Unit* victimControlledUnit = victim->GetFirstControlled())
13652 {
13653 victimControlledUnit->SetInCombatWith(this);
13654 SetInCombatWith(victimControlledUnit);
13655 victimControlledUnit->AddThreat(this, 0.0f);
13656 }
13657 }
13658
13659 // if unit has an owner, put owner in combat.
13660 if (Unit* victimOwner = victim->GetOwner())
13661 {
13662 if (!(victimOwner->IsInCombatWith(this)))
13663 {
13664 /* warding off to not take over aggro for no reason
13665 Using only AddThreat causes delay in attack */
13666 if (!victimOwner->IsInCombat() && victimOwner->IsAIEnabled)
13667 {
13668 victimOwner->ToCreature()->AI()->AttackStart(this);
13669 }
13670 victimOwner->SetInCombatWith(this);
13671 SetInCombatWith(victimOwner);
13672 victimOwner->AddThreat(this, 0.0f);
13673 }
13674 }
13675 }
13676
13677 bool alreadyInCombat = IsInCombat();
13678
13679 SetInCombatWith(victim);
13680 victim->SetInCombatWith(this);
13681
13682 // Xinef: If pet started combat - put owner in combat
13683 if (!alreadyInCombat && IsInCombat())
13684 {
13685 if (Unit* owner = GetOwner())
13686 {
13687 owner->SetInCombatWith(victim);
13688 victim->SetInCombatWith(owner);
13689 }
13690 }
13691 }
13692
13693 Unit* who = victim->GetCharmerOrOwnerOrSelf();
13694 if (who->IsPlayer())
13695 SetContestedPvP(who->ToPlayer());
13696
13698 if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who))
13699 {
13700 player->UpdatePvP(true);
13702 }
13703}
@ AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT
Definition: SpellDefines.h:66
@ REACT_PASSIVE
Definition: Unit.h:548
@ UNIT_STAND_STATE_STAND
Definition: UnitDefines.h:32
void UpdatePvP(bool state, bool _override=false)
Definition: PlayerUpdates.cpp:1483
Unit * GetCharmerOrOwnerOrSelf() const
Definition: Unit.h:1212
void SetContestedPvP(Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
Definition: Unit.cpp:17249
Unit * GetFirstControlled() const
Definition: Unit.cpp:11075
bool IsInCombat() const
Definition: Unit.h:884

References Creature::AI(), CreatureAI::AttackedBy(), UnitAI::AttackStart(), AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetFirstControlled(), GetOwner(), getStandState(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), IsInCombat(), IsPet(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), REACT_PASSIVE, RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), SetStandState(), Object::ToCreature(), Object::ToPlayer(), UNIT_STAND_STATE_STAND, and Player::UpdatePvP().

Referenced by AttackerStateUpdate(), Spell::CheckCast(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectTaunt(), and AssistDelayEvent::Execute().

◆ CombatStartOnCast()

void Unit::CombatStartOnCast ( Unit target,
bool  initialAggro = true,
uint32  duration = 0 
)
13706{
13707 // Xinef: Dont allow to start combat with triggers
13708 if (target->IsCreature() && target->ToCreature()->IsTrigger())
13709 return;
13710
13711 if (initialAggro)
13712 {
13713 SetInCombatWith(target, duration);
13714
13715 // Xinef: If pet started combat - put owner in combat
13716 if (Unit* owner = GetOwner())
13717 owner->SetInCombatWith(target, duration);
13718 }
13719
13720 Unit* who = target->GetCharmerOrOwnerOrSelf();
13721 if (who->IsPlayer())
13722 SetContestedPvP(who->ToPlayer());
13723
13725 if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who))
13726 {
13727 player->UpdatePvP(true);
13729 }
13730}
bool IsTrigger() const
Definition: Creature.h:75

References AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetOwner(), Object::IsCreature(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), Object::ToCreature(), Object::ToPlayer(), and Player::UpdatePvP().

Referenced by Spell::_cast().

◆ CombatStop()

void Unit::CombatStop ( bool  includingCast = false)
10437{
10438 if (includingCast && IsNonMeleeSpellCast(false))
10440
10441 AttackStop();
10443 if (IsPlayer())
10444 ToPlayer()->SendAttackSwingCancelAttack(); // melee and ranged forced attack cancel
10445 if (Creature* pCreature = ToCreature())
10446 pCreature->ClearLastLeashExtensionTimePtr();
10447 ClearInCombat();
10448
10449 // xinef: just in case
10450 if (IsPetInCombat() && !IsPlayer())
10452}
void SendAttackSwingCancelAttack()
Definition: PlayerMisc.cpp:140
bool IsPetInCombat() const
Definition: Unit.h:887
void ClearInPetCombat()
Definition: Unit.cpp:13844
void RemoveAllAttackers()
Remove all units in m_attackers list and send them AttackStop()
Definition: Unit.cpp:10484
void ClearInCombat()
Definition: Unit.cpp:13809
bool AttackStop()
Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell...
Definition: Unit.cpp:10403

References AttackStop(), ClearInCombat(), ClearInPetCombat(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), IsPetInCombat(), Object::IsPlayer(), RemoveAllAttackers(), Player::SendAttackSwingCancelAttack(), Object::ToCreature(), and Object::ToPlayer().

Referenced by CreatureAI::_EnterEvadeMode(), PetAI::_stopAttack(), Player::ActivateTaxiPathTo(), CleanupBeforeRemoveFromMap(), CombatStopWithPets(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_kalecgos::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_maiev_illidan::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), Spell::EffectSanctuary(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), TotemAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::FlyAway(), Aura::HandleAuraSpecificMods(), misc_commandscript::HandleCombatStopCommand(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), npc_commandscript::HandleNpcDeleteCommand(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_supremus_punch_invisible_stalker::IsSummonedBy(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::JustEngagedWith(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), Kill(), boss_urom::boss_uromAI::LeaveCombat(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), SmartScript::ProcessAction(), Player::RemovePet(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::Reset(), setDeathState(), npc_crusade_persuaded::npc_crusade_persuadedAI::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), Player::TeleportTo(), Totem::UnSummon(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_frost_freeze_trap::npc_frost_freeze_trapAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ CombatStopWithPets()

void Unit::CombatStopWithPets ( bool  includingCast = false)
10455{
10456 CombatStop(includingCast);
10457
10458 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10459 (*itr)->CombatStop(includingCast);
10460}

References CombatStop(), and m_Controlled.

Referenced by DealDamage(), WorldSession::HandleDuelCancelledOpcode(), Player::SetGameMaster(), Player::SetGMVisible(), and Player::UpdateArea().

◆ CountPctFromCurHealth()

uint32 Unit::CountPctFromCurHealth ( int32  pct) const
inline
1043{ return CalculatePct(GetHealth(), pct); }
uint32 GetHealth() const
Definition: Unit.h:1029

References CalculatePct(), and GetHealth().

Referenced by spell_gen_leeching_swarm_aura::HandleEffectPeriodic().

◆ CountPctFromMaxHealth()

uint32 Unit::CountPctFromMaxHealth ( int32  pct) const
inline
1042{ return CalculatePct(GetMaxHealth(), pct); }
uint32 GetMaxHealth() const
Definition: Unit.h:1030

References CalculatePct(), and GetMaxHealth().

Referenced by spell_pri_guardian_spirit::Absorb(), spell_rog_cheat_death::Absorb(), spell_pal_ardent_defender::Absorb(), spell_dru_survival_instincts_aura::AfterApply(), spell_dk_anti_magic_shell_self::CalculateAmount(), spell_dk_vampiric_blood::CalculateAmount(), boss_ichoron::boss_ichoronAI::DoAction(), Spell::EffectHeal(), Spell::EffectHealPct(), Spell::EffectResurrect(), Spell::EffectResurrectPet(), Spell::EffectSelfResurrect(), Spell::EffectSummonType(), spell_alar_ember_blast::HandleCast(), misc_commandscript::HandleDamageCommand(), spell_dk_death_strike::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_warr_last_stand::HandleDummy(), HandleDummyAuraProc(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), boss_harbinger_skyriss::JustSummoned(), boss_hadronox::boss_hadronoxAI::KilledUnit(), Pet::LoadPetFromDB(), boss_vaelastrasz::boss_vaelAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), boss_murmur::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), and npc_injured_patient::npc_injured_patientAI::UpdateAI().

◆ CreateTamedPetFrom() [1/2]

Pet * Unit::CreateTamedPetFrom ( Creature creatureTarget,
uint32  spell_id = 0 
)
17353{
17354 if (!IsPlayer())
17355 return nullptr;
17356
17357 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17358
17359 if (!pet->CreateBaseAtCreature(creatureTarget))
17360 {
17361 delete pet;
17362 return nullptr;
17363 }
17364
17365 uint8 level = creatureTarget->GetLevel() + 5 < GetLevel() ? (GetLevel() - 5) : creatureTarget->GetLevel();
17366
17367 if (!InitTamedPet(pet, level, spell_id))
17368 {
17369 delete pet;
17370 return nullptr;
17371 }
17372
17373 return pet;
17374}
@ HUNTER_PET
Definition: PetDefines.h:32
bool CreateBaseAtCreature(Creature *creature)
Definition: Pet.cpp:938
bool InitTamedPet(Pet *pet, uint8 level, uint32 spell_id)
Definition: Unit.cpp:17396

References Pet::CreateBaseAtCreature(), GetLevel(), HUNTER_PET, InitTamedPet(), Object::IsPlayer(), and Object::ToPlayer().

Referenced by Player::CreatePet(), Spell::EffectCreateTamedPet(), and Spell::EffectTameCreature().

◆ CreateTamedPetFrom() [2/2]

Pet * Unit::CreateTamedPetFrom ( uint32  creatureEntry,
uint32  spell_id = 0 
)
17377{
17378 if (!IsPlayer())
17379 return nullptr;
17380
17381 CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(creatureEntry);
17382 if (!creatureInfo)
17383 return nullptr;
17384
17385 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17386
17387 if (!pet->CreateBaseAtCreatureInfo(creatureInfo, this) || !InitTamedPet(pet, GetLevel(), spell_id))
17388 {
17389 delete pet;
17390 return nullptr;
17391 }
17392
17393 return pet;
17394}
#define sObjectMgr
Definition: ObjectMgr.h:1635
Definition: CreatureData.h:186
bool CreateBaseAtCreatureInfo(CreatureTemplate const *cinfo, Unit *owner)
Definition: Pet.cpp:973

References Pet::CreateBaseAtCreatureInfo(), GetLevel(), HUNTER_PET, InitTamedPet(), Object::IsPlayer(), sObjectMgr, and Object::ToPlayer().

◆ CreateVehicleKit()

bool Unit::CreateVehicleKit ( uint32  id,
uint32  creatureEntry 
)

Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)

18717{
18718 VehicleEntry const* vehInfo = sVehicleStore.LookupEntry(id);
18719 if (!vehInfo)
18720 return false;
18721
18722 m_vehicleKit = new Vehicle(this, vehInfo, creatureEntry);
18725 return true;
18726}
@ UPDATEFLAG_VEHICLE
Definition: UpdateData.h:46
@ UNIT_MASK_VEHICLE
Definition: UnitDefines.h:140
DBCStorage< VehicleEntry > sVehicleStore(VehicleEntryfmt)

References m_unitTypeMask, Object::m_updateFlag, m_vehicleKit, sVehicleStore, UNIT_MASK_VEHICLE, and UPDATEFLAG_VEHICLE.

Referenced by Creature::CreateFromProto(), AuraEffect::HandleAuraSetVehicle(), Mount(), and npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit().

◆ DealDamage()

uint32 Unit::DealDamage ( Unit attacker,
Unit victim,
uint32  damage,
CleanDamage const *  cleanDamage = nullptr,
DamageEffectType  damagetype = DIRECT_DAMAGE,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL,
SpellInfo const *  spellProto = nullptr,
bool  durabilityLoss = true,
bool  allowGM = false,
Spell const *  spell = nullptr 
)
static

@fix: Hack to avoid premature leashing

811{
812 // Xinef: initialize damage done for rage calculations
813 // Xinef: its rare to modify damage in hooks, however training dummy's sets damage to 0
814 uint32 rage_damage = damage + ((cleanDamage != nullptr) ? cleanDamage->absorbed_damage : 0);
815
816 //if (attacker)
817 {
818 if (victim->IsAIEnabled)
819 victim->GetAI()->DamageTaken(attacker, damage, damagetype, damageSchoolMask);
820
821 if (attacker && attacker->IsAIEnabled)
822 attacker->GetAI()->DamageDealt(victim, damage, damagetype);
823 }
824
825 // Hook for OnDamage Event
826 sScriptMgr->OnDamage(attacker, victim, damage);
827
828 if (victim->IsPlayer() && attacker != victim)
829 {
830 // Signal to pets that their owner was attacked
831 Pet* pet = victim->ToPlayer()->GetPet();
832
833 if (pet && pet->IsAlive())
834 pet->AI()->OwnerAttackedBy(attacker);
835 }
836
837 //Dont deal damage to unit if .cheat god is enable.
838 if (victim->IsPlayer())
839 {
840 if (victim->ToPlayer()->GetCommandStatus(CHEAT_GOD))
841 {
842 return 0;
843 }
844 }
845
846 // Signal the pet it was attacked so the AI can respond if needed
847 if (victim->IsCreature() && attacker != victim && victim->IsPet() && victim->IsAlive())
848 victim->ToPet()->AI()->AttackedBy(attacker);
849
850 if (damagetype != NODAMAGE)
851 {
852 // interrupting auras with AURA_INTERRUPT_FLAG_DAMAGE before checking !damage (absorbed damage breaks that type of auras)
853 if (spellProto)
854 {
855 if (!spellProto->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
857 }
858 else
860
861 // interrupt spells with SPELL_INTERRUPT_FLAG_ABORT_ON_DMG on absorbed damage (no dots)
862 if (!damage && damagetype != DOT && cleanDamage && cleanDamage->absorbed_damage)
863 {
864 if (victim != attacker && victim->IsPlayer())
865 {
866 if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
867 {
868 if (spell->getState() == SPELL_STATE_PREPARING)
869 {
870 uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
871 if (interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
872 {
873 victim->InterruptNonMeleeSpells(false);
874 }
875 }
876 }
877 }
878 }
879
880 // We're going to call functions which can modify content of the list during iteration over it's elements
881 // Let's copy the list so we can prevent iterator invalidation
883 // copy damage to casters of this aura
884 for (AuraEffectList::iterator i = vCopyDamageCopy.begin(); i != vCopyDamageCopy.end(); ++i)
885 {
886 // Check if aura was removed during iteration - we don't need to work on such auras
887 if (!((*i)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
888 continue;
889 // check damage school mask
890 if (((*i)->GetMiscValue() & damageSchoolMask) == 0)
891 continue;
892
893 Unit* shareDamageTarget = (*i)->GetCaster();
894 if (!shareDamageTarget)
895 continue;
896 SpellInfo const* spell = (*i)->GetSpellInfo();
897
898 uint32 shareDamage = CalculatePct(damage, (*i)->GetAmount());
899
900 uint32 shareAbsorb = 0;
901 uint32 shareResist = 0;
902
903 if (shareDamageTarget->IsImmunedToDamageOrSchool(damageSchoolMask))
904 {
905 shareAbsorb = shareDamage;
906 shareDamage = 0;
907 }
908 else
909 {
910 DamageInfo sharedDamageInfo(attacker, shareDamageTarget, shareDamage, spellProto, damageSchoolMask, damagetype);
911 Unit::CalcAbsorbResist(sharedDamageInfo, true);
912 shareAbsorb = sharedDamageInfo.GetAbsorb();
913 shareResist = sharedDamageInfo.GetResist();
914 shareDamage = sharedDamageInfo.GetDamage();
915 Unit::DealDamageMods(shareDamageTarget, shareDamage, &shareAbsorb);
916 }
917
918 if (attacker && shareDamageTarget->IsPlayer())
919 {
920 attacker->SendSpellNonMeleeDamageLog(shareDamageTarget, spell, shareDamage, damageSchoolMask, shareAbsorb, shareResist, damagetype == DIRECT_DAMAGE, 0, false, true);
921 }
922
923 Unit::DealDamage(attacker, shareDamageTarget, shareDamage, cleanDamage, NODAMAGE, damageSchoolMask, spellProto, false, false, damageSpell);
924 }
925 }
926
927 // Rage from Damage made (only from direct weapon damage)
928 if (attacker && cleanDamage && damagetype == DIRECT_DAMAGE && attacker != victim && attacker->HasActivePowerType(POWER_RAGE))
929 {
930 uint32 weaponSpeedHitFactor;
931
932 switch (cleanDamage->attackType)
933 {
934 case BASE_ATTACK:
935 case OFF_ATTACK:
936 {
937 weaponSpeedHitFactor = uint32(attacker->GetAttackTime(cleanDamage->attackType) / 1000.0f * (cleanDamage->attackType == BASE_ATTACK ? 3.5f : 1.75f));
938 if (cleanDamage->hitOutCome == MELEE_HIT_CRIT)
939 weaponSpeedHitFactor *= 2;
940
941 attacker->RewardRage(rage_damage, weaponSpeedHitFactor, true);
942 break;
943 }
944 case RANGED_ATTACK:
945 break;
946 default:
947 break;
948 }
949 }
950
951 if (!damage)
952 {
953 // Rage from absorbed damage
954 if (cleanDamage && cleanDamage->absorbed_damage)
955 {
956 if (victim->HasActivePowerType(POWER_RAGE))
957 victim->RewardRage(cleanDamage->absorbed_damage, 0, false);
958
959 if (attacker && attacker->HasActivePowerType(POWER_RAGE))
960 attacker->RewardRage(cleanDamage->absorbed_damage, 0, true);
961 }
962
963 return 0;
964 }
965
966 LOG_DEBUG("entities.unit", "DealDamageStart");
967
968 uint32 health = victim->GetHealth();
969 LOG_DEBUG("entities.unit", "deal dmg:{} to health:{} ", damage, health);
970
971 // duel ends when player has 1 or less hp
972 bool duel_hasEnded = false;
973 bool duel_wasMounted = false;
974 if (victim->IsPlayer() && victim->ToPlayer()->duel && damage >= (health - 1))
975 {
976 // xinef: situation not possible earlier, just return silently.
977 if (!attacker)
978 return 0;
979
980 // prevent kill only if killed in duel and killed by opponent or opponent controlled creature
981 if (victim->ToPlayer()->duel->Opponent == attacker || victim->ToPlayer()->duel->Opponent->GetGUID() == attacker->GetOwnerGUID())
982 damage = health - 1;
983
984 duel_hasEnded = true;
985 }
986 else if (victim->IsVehicle() && damage >= (health - 1) && victim->GetCharmer() && victim->GetCharmer()->IsPlayer())
987 {
988 Player* victimRider = victim->GetCharmer()->ToPlayer();
989
990 if (victimRider && victimRider->duel && victimRider->duel->IsMounted)
991 {
992 // xinef: situation not possible earlier, just return silently.
993 if (!attacker)
994 return 0;
995
996 // prevent kill only if killed in duel and killed by opponent or opponent controlled creature
997 if (victimRider->duel->Opponent == attacker || victimRider->duel->Opponent->GetGUID() == attacker->GetCharmerGUID())
998 damage = health - 1;
999
1000 duel_wasMounted = true;
1001 duel_hasEnded = true;
1002 }
1003 }
1004
1005 if (attacker && attacker != victim)
1006 if (Player* killer = attacker->GetCharmerOrOwnerPlayerOrPlayerItself())
1007 {
1008 // pussywizard: don't allow GMs to deal damage in normal way (this leaves no evidence in logs!), they have commands to do so
1009 //if (!allowGM && killer->GetSession()->GetSecurity() && killer->GetSession()->GetSecurity() <= SEC_ADMINISTRATOR)
1010 // return 0;
1011
1012 if (Battleground* bg = killer->GetBattleground())
1013 {
1014 bg->UpdatePlayerScore(killer, SCORE_DAMAGE_DONE, damage);
1015 killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, damage, 0, victim); // pussywizard: InBattleground() optimization
1016 }
1017 //killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT, damage); // pussywizard: optimization
1018 }
1019
1020 if (victim->IsPlayer())
1021 ;//victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, damage); // pussywizard: optimization
1022 else if (!victim->IsControlledByPlayer() || victim->IsVehicle())
1023 {
1024 if (!victim->ToCreature()->hasLootRecipient())
1025 victim->ToCreature()->SetLootRecipient(attacker);
1026
1027 if (!attacker || attacker->IsControlledByPlayer() || attacker->IsCreatedByPlayer())
1028 {
1029 uint32 unDamage = health < damage ? health : damage;
1030 bool damagedByPlayer = unDamage && attacker && (attacker->IsPlayer() || attacker->m_movedByPlayer != nullptr);
1031 victim->ToCreature()->LowerPlayerDamageReq(unDamage, damagedByPlayer);
1032 }
1033 }
1034
1035 if (health <= damage)
1036 {
1037 LOG_DEBUG("entities.unit", "DealDamage: victim just died");
1038
1039 //if (attacker && victim->IsPlayer() && victim != attacker)
1040 //victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, health); // pussywizard: optimization
1041 Unit::Kill(attacker, victim, durabilityLoss, cleanDamage ? cleanDamage->attackType : BASE_ATTACK, spellProto, damageSpell);
1042 }
1043 else
1044 {
1045 LOG_DEBUG("entities.unit", "DealDamageAlive");
1046
1047 //if (victim->IsPlayer())
1048 // victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, damage); // pussywizard: optimization
1049
1050 victim->ModifyHealth(- (int32)damage);
1051
1052 if (damagetype == DIRECT_DAMAGE || damagetype == SPELL_DIRECT_DAMAGE)
1053 victim->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, spellProto ? spellProto->Id : 0);
1054
1055 if (!victim->IsPlayer())
1056 {
1058 if (damagetype != DOT && damage > 0 && !victim->GetOwnerGUID().IsPlayer() && (!spellProto || !spellProto->HasAura(SPELL_AURA_DAMAGE_SHIELD)))
1060
1061 if (attacker)
1062 {
1063 if (spellProto && victim->CanHaveThreatList() && !victim->HasUnitState(UNIT_STATE_EVADE) && !victim->IsInCombatWith(attacker))
1064 {
1065 victim->CombatStart(attacker, !(spellProto->AttributesEx3 & SPELL_ATTR3_SUPPRESS_TARGET_PROCS));
1066 }
1067
1068 victim->AddThreat(attacker, float(damage), damageSchoolMask, spellProto);
1069 }
1070 }
1071 else // victim is a player
1072 {
1073 // random durability for items (HIT TAKEN)
1075 {
1078 }
1079 }
1080
1081 // Rage from damage received
1082 if (attacker != victim && victim->HasActivePowerType(POWER_RAGE))
1083 {
1084 uint32 rageDamage = damage + (cleanDamage ? cleanDamage->absorbed_damage : 0);
1085 victim->RewardRage(rageDamage, 0, false);
1086 }
1087
1088 if (attacker && attacker->IsPlayer())
1089 {
1090 // random durability for items (HIT DONE)
1092 {
1094 attacker->ToPlayer()->DurabilityPointLossForEquipSlot(slot);
1095 }
1096 }
1097
1098 if (damagetype != NODAMAGE && damage && (!spellProto || !(spellProto->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC) || spellProto->HasAttribute(SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK))))
1099 {
1100 if (victim != attacker && victim->IsPlayer()) // does not support creature push_back
1101 {
1102 if (damagetype != DOT && !(damageSpell && damageSpell->m_targets.HasDstChannel()))
1103 {
1104 if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
1105 {
1106 if (spell->getState() == SPELL_STATE_PREPARING)
1107 {
1108 uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
1109 if (interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
1110 {
1111 victim->InterruptNonMeleeSpells(false);
1112 }
1113 else if (interruptFlags & SPELL_INTERRUPT_FLAG_PUSH_BACK)
1114 {
1115 spell->Delayed();
1116 }
1117 }
1118 }
1119
1120 if (Spell* spell = victim->m_currentSpells[CURRENT_CHANNELED_SPELL])
1121 if (spell->getState() == SPELL_STATE_CASTING)
1122 {
1123 if ((spell->m_spellInfo->ChannelInterruptFlags & CHANNEL_FLAG_DELAY) != 0)
1124 {
1125 spell->DelayedChannel();
1126 }
1127 }
1128 }
1129 }
1130 }
1131
1132 // last damage from duel opponent
1133 if (duel_hasEnded)
1134 {
1135 Player* he = duel_wasMounted ? victim->GetCharmer()->ToPlayer() : victim->ToPlayer();
1136
1137 ASSERT_NODEBUGINFO(he && he->duel);
1138
1139 if (duel_wasMounted) // In this case victim==mount
1140 victim->SetHealth(1);
1141 else
1142 he->SetHealth(1);
1143
1144 he->duel->Opponent->CombatStopWithPets(true);
1145 he->CombatStopWithPets(true);
1146
1147 he->CastSpell(he, 7267, true); // beg
1149 }
1150 }
1151
1152 LOG_DEBUG("entities.unit", "DealDamageEnd returned {} damage", damage);
1153
1154 return damage;
1155}
#define ASSERT_NODEBUGINFO
Definition: Errors.h:69
bool roll_chance_f(float chance)
Definition: Random.h:53
@ ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE
Definition: DBCEnums.h:130
@ POWER_RAGE
Definition: SharedDefines.h:270
@ SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK
Definition: SharedDefines.h:647
@ SPELL_ATTR3_TREAT_AS_PERIODIC
Definition: SharedDefines.h:518
@ SPELL_ATTR3_SUPPRESS_TARGET_PROCS
Definition: SharedDefines.h:510
@ DUEL_WON
Definition: SharedDefines.h:3613
@ SPELL_ATTR4_REACTIVE_DAMAGE_PROC
Definition: SharedDefines.h:544
@ SPELL_STATE_PREPARING
Definition: Spell.h:227
@ SPELL_STATE_CASTING
Definition: Spell.h:228
@ CHANNEL_FLAG_DELAY
Definition: SpellDefines.h:38
@ AURA_INTERRUPT_FLAG_TAKE_DAMAGE
Definition: SpellDefines.h:44
@ AURA_INTERRUPT_FLAG_DIRECT_DAMAGE
Definition: SpellDefines.h:67
@ SPELL_INTERRUPT_FLAG_ABORT_ON_DMG
Definition: SpellDefines.h:30
@ SPELL_INTERRUPT_FLAG_PUSH_BACK
Definition: SpellDefines.h:27
@ SPELL_AURA_DAMAGE_SHIELD
Definition: SpellAuraDefines.h:78
@ SPELL_AURA_SHARE_DAMAGE_PCT
Definition: SpellAuraDefines.h:363
@ RATE_DURABILITY_LOSS_DAMAGE
Definition: IWorld.h:513
@ CHEAT_GOD
Definition: Player.h:999
EquipmentSlots
Definition: Player.h:673
@ EQUIPMENT_SLOT_END
Definition: Player.h:694
@ NODAMAGE
Definition: Unit.h:252
@ CURRENT_CHANNELED_SPELL
Definition: Unit.h:539
@ CURRENT_GENERIC_SPELL
Definition: Unit.h:538
@ SCORE_DAMAGE_DONE
Definition: BattlegroundScore.h:32
virtual void DamageTaken(Unit *, uint32 &, DamageEffectType, SpellSchoolMask)
Called at any Damage from any attacker (before damage apply)
Definition: UnitAI.h:369
virtual void DamageDealt(Unit *, uint32 &, DamageEffectType)
Called at any Damage to any victim (before damage apply)
Definition: UnitAI.h:362
virtual void OwnerAttackedBy(Unit *)
Definition: CreatureAI.h:173
virtual void AttackedBy(Unit *)
Definition: CreatureAI.h:150
void SetLootRecipient(Unit *unit, bool withGroup=true)
Definition: Creature.cpp:1320
bool hasLootRecipient() const
Definition: Creature.h:231
void UpdateLeashExtensionTime()
Definition: Creature.cpp:3713
void LowerPlayerDamageReq(uint32 unDamage, bool damagedByPlayer=true)
Definition: Creature.cpp:3806
bool IsPlayer() const
Definition: ObjectGuid.h:168
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition: PlayerUpdates.cpp:2130
void DurabilityPointLossForEquipSlot(EquipmentSlots slot)
Definition: Player.cpp:4813
Pet * GetPet() const
Definition: Player.cpp:8917
bool GetCommandStatus(uint32 command) const
Definition: Player.h:1178
int32 ModifyHealth(int32 val)
Definition: Unit.cpp:14091
Pet * ToPet()
Definition: Unit.h:694
bool IsCreatedByPlayer() const
Definition: Unit.h:1233
Unit * GetCharmer() const
Definition: Unit.cpp:10608
static void Kill(Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
Definition: Unit.cpp:17703
void RewardRage(uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
Definition: Unit.cpp:20137
void SetHealth(uint32 val)
Definition: Unit.cpp:15478
ObjectGuid GetCharmerGUID() const
Definition: Unit.h:684
virtual bool HasActivePowerType(Powers power)
Definition: Unit.h:1053
void CombatStopWithPets(bool includingCast=false)
Definition: Unit.cpp:10454
uint32 ChannelInterruptFlags
Definition: SpellInfo.h:354
uint32 InterruptFlags
Definition: SpellInfo.h:352

References CleanDamage::absorbed_damage, ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, AddThreat(), Creature::AI(), ASSERT_NODEBUGINFO, CreatureAI::AttackedBy(), CleanDamage::attackType, SpellInfo::AttributesEx3, AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, AURA_INTERRUPT_FLAG_TAKE_DAMAGE, BASE_ATTACK, CalcAbsorbResist(), CalculatePct(), CanHaveThreatList(), CastSpell(), CHANNEL_FLAG_DELAY, CHEAT_GOD, CombatStart(), CombatStopWithPets(), CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, UnitAI::DamageDealt(), UnitAI::DamageTaken(), DealDamage(), DealDamageMods(), DIRECT_DAMAGE, DOT, Player::duel, DUEL_WON, Player::DuelComplete(), Player::DurabilityPointLossForEquipSlot(), EQUIPMENT_SLOT_END, DamageInfo::GetAbsorb(), GetAI(), GetAttackTime(), GetAuraEffectsByType(), GetCharmer(), GetCharmerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), Player::GetCommandStatus(), DamageInfo::GetDamage(), Object::GetGUID(), GetHealth(), GetOwnerGUID(), Player::GetPet(), DamageInfo::GetResist(), HasActivePowerType(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellCastTargets::HasDstChannel(), Creature::hasLootRecipient(), HasUnitState(), CleanDamage::hitOutCome, SpellInfo::Id, InterruptNonMeleeSpells(), IsAIEnabled, IsAlive(), IsControlledByPlayer(), IsCreatedByPlayer(), Object::IsCreature(), IsImmunedToDamageOrSchool(), IsInCombatWith(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), IsVehicle(), Kill(), LOG_DEBUG, Creature::LowerPlayerDamageReq(), m_currentSpells, m_movedByPlayer, Spell::m_targets, MELEE_HIT_CRIT, ModifyHealth(), NODAMAGE, OFF_ATTACK, CreatureAI::OwnerAttackedBy(), POWER_RAGE, RANGED_ATTACK, RATE_DURABILITY_LOSS_DAMAGE, RemoveAurasWithInterruptFlags(), RewardRage(), roll_chance_f(), SCORE_DAMAGE_DONE, SendSpellNonMeleeDamageLog(), SetHealth(), Creature::SetLootRecipient(), SPELL_ATTR3_SUPPRESS_TARGET_PROCS, SPELL_ATTR3_TREAT_AS_PERIODIC, SPELL_ATTR4_REACTIVE_DAMAGE_PROC, SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK, SPELL_AURA_DAMAGE_SHIELD, SPELL_AURA_SHARE_DAMAGE_PCT, SPELL_DIRECT_DAMAGE, SPELL_INTERRUPT_FLAG_ABORT_ON_DMG, SPELL_INTERRUPT_FLAG_PUSH_BACK, SPELL_STATE_CASTING, SPELL_STATE_PREPARING, sScriptMgr, sWorld, Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_STATE_EVADE, Player::UpdateAchievementCriteria(), Creature::UpdateLeashExtensionTime(), and urand().

Referenced by CalcAbsorbResist(), DealDamage(), DealMeleeDamage(), DealSpellDamage(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::DoDie(), Spell::EffectInstaKill(), Player::EnvironmentalDamage(), spell_mt_phoenix_burn::HandleAfterCast(), spell_alar_ember_blast::HandleCast(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), spell_svala_ritual_strike::HandleDummyEffect(), spell_valkyr_touch_aura::HandleEffectPeriodic(), spell_lady_vashj_magic_barrier::HandleEffectRemove(), spell_algalon_collapse_aura::HandlePeriodic(), spell_kaelthas_burn::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_gluth_decimate::HandleScriptEffect(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ DealDamageMods()

void Unit::DealDamageMods ( Unit const *  victim,
uint32 damage,
uint32 absorb 
)
static

◆ DealHeal()

int32 Unit::DealHeal ( Unit healer,
Unit victim,
uint32  addhealth 
)
static
10952{
10953 int32 gain = 0;
10954
10955 if (healer)
10956 {
10957 if (victim->IsAIEnabled)
10958 victim->GetAI()->HealReceived(healer, addhealth);
10959
10960 if (healer->IsAIEnabled)
10961 healer->GetAI()->HealDone(victim, addhealth);
10962 }
10963
10964 if (addhealth)
10965 gain = victim->ModifyHealth(int32(addhealth));
10966
10967 // Hook for OnHeal Event
10968 sScriptMgr->OnHeal(healer, victim, (uint32&)gain);
10969
10970 Unit* unit = healer;
10971
10972 if (healer && healer->IsCreature() && healer->ToCreature()->IsTotem())
10973 unit = healer->GetOwner();
10974
10975 if (!unit)
10976 return gain;
10977
10978 if (Player* player = unit->ToPlayer())
10979 {
10980 if (Battleground* bg = player->GetBattleground())
10981 bg->UpdatePlayerScore(player, SCORE_HEALING_DONE, gain);
10982
10983 // use the actual gain, as the overheal shall not be counted, skip gain 0 (it ignored anyway in to criteria)
10984 if (gain && player->InBattleground()) // pussywizard: InBattleground() optimization
10985 player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, gain, 0, victim);
10986
10987 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED, addhealth); // pussywizard: optimization
10988 }
10989
10990 /*if (Player* player = victim->ToPlayer())
10991 {
10992 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED, gain); // pussywizard: optimization
10993 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED, addhealth); // pussywizard: optimization
10994 }*/
10995
10996 return gain;
10997}
@ ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE
Definition: DBCEnums.h:169
@ SCORE_HEALING_DONE
Definition: BattlegroundScore.h:33
virtual void HealReceived(Unit *, uint32 &)
Called when the creature receives heal.
Definition: UnitAI.h:372
virtual void HealDone(Unit *, uint32 &)
Called when the unit heals.
Definition: UnitAI.h:378

References ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, GetAI(), GetOwner(), UnitAI::HealDone(), UnitAI::HealReceived(), IsAIEnabled, Object::IsCreature(), IsTotem(), ModifyHealth(), SCORE_HEALING_DONE, sScriptMgr, Object::ToCreature(), and Object::ToPlayer().

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), HealBySpell(), and npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI().

◆ DealMeleeDamage()

void Unit::DealMeleeDamage ( CalcDamageInfo damageInfo,
bool  durabilityLoss 
)
Todo:
: Move this to a packet handler
1830{
1831 Unit* victim = damageInfo->target;
1832
1833 auto canTakeMeleeDamage = [&]()
1834 {
1835 return victim->IsAlive() && !victim->HasUnitState(UNIT_STATE_IN_FLIGHT) && (!victim->IsCreature() || !victim->ToCreature()->IsEvadingAttacks());
1836 };
1837
1838 if (!canTakeMeleeDamage())
1839 {
1840 return;
1841 }
1842
1843 // Hmmmm dont like this emotes client must by self do all animations
1844 if (damageInfo->HitInfo & HITINFO_CRITICALHIT)
1846 if (damageInfo->blocked_amount && damageInfo->TargetState != VICTIMSTATE_BLOCKS)
1848
1849 // Parry haste is enabled if it's not a creature or if the creature doesn't have the NO_PARRY_HASTEN flag.
1850 bool isParryHasteEnabled = !victim->IsCreature() ||
1852 if (damageInfo->TargetState == VICTIMSTATE_PARRY && isParryHasteEnabled)
1853 {
1854 // Get attack timers
1855 float offtime = float(victim->getAttackTimer(OFF_ATTACK));
1856 float basetime = float(victim->getAttackTimer(BASE_ATTACK));
1857 // Reduce attack time
1858 if (victim->HasOffhandWeaponForAttack() && offtime < basetime)
1859 {
1860 float percent20 = victim->GetAttackTime(OFF_ATTACK) * 0.20f;
1861 float percent60 = 3.0f * percent20;
1862 if (offtime > percent20 && offtime <= percent60)
1863 victim->setAttackTimer(OFF_ATTACK, uint32(percent20));
1864 else if (offtime > percent60)
1865 {
1866 offtime -= 2.0f * percent20;
1867 victim->setAttackTimer(OFF_ATTACK, uint32(offtime));
1868 }
1869 }
1870 else
1871 {
1872 float percent20 = victim->GetAttackTime(BASE_ATTACK) * 0.20f;
1873 float percent60 = 3.0f * percent20;
1874 if (basetime > percent20 && basetime <= percent60)
1875 victim->setAttackTimer(BASE_ATTACK, uint32(percent20));
1876 else if (basetime > percent60)
1877 {
1878 basetime -= 2.0f * percent20;
1879 victim->setAttackTimer(BASE_ATTACK, uint32(basetime));
1880 }
1881 }
1882 }
1883
1884 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1885 {
1886 if (!canTakeMeleeDamage() || (!damageInfo->damages[i].damage && !damageInfo->damages[i].absorb && !damageInfo->damages[i].resist))
1887 {
1888 continue;
1889 }
1890
1891 // Call default DealDamage
1892 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->damages[i].absorb, damageInfo->attackType, damageInfo->hitOutCome);
1893 Unit::DealDamage(this, victim, damageInfo->damages[i].damage, &cleanDamage, DIRECT_DAMAGE, SpellSchoolMask(damageInfo->damages[i].damageSchoolMask), nullptr, durabilityLoss);
1894 }
1895
1896 // gain rage if attack is fully blocked, dodged or parried
1898 {
1899 switch (damageInfo->attackType)
1900 {
1901 case BASE_ATTACK:
1902 case OFF_ATTACK:
1903 {
1904 uint32 weaponSpeedHitFactor = uint32(GetAttackTime(damageInfo->attackType) / 1000.0f * (damageInfo->attackType == BASE_ATTACK ? 3.5f : 1.75f));
1905 RewardRage(damageInfo->cleanDamage, weaponSpeedHitFactor, true);
1906 break;
1907 }
1908 default:
1909 break;
1910 }
1911 }
1912
1913 // If this is a creature and it attacks from behind it has a probability to daze it's victim
1914 if ((damageInfo->damages[0].damage + damageInfo->damages[1].damage) && ((damageInfo->hitOutCome == MELEE_HIT_CRIT || damageInfo->hitOutCome == MELEE_HIT_CRUSHING || damageInfo->hitOutCome == MELEE_HIT_NORMAL || damageInfo->hitOutCome == MELEE_HIT_GLANCING) &&
1915 !IsPlayer() && !ToCreature()->IsControlledByPlayer() && !victim->HasInArc(M_PI, this)
1916 && (victim->IsPlayer() || !victim->ToCreature()->isWorldBoss()) && !victim->IsVehicle()))
1917 {
1918 // -probability is between 0% and 40%
1919 // 20% base chance
1920 float Probability = 20.0f;
1921
1922 // there is a newbie protection, at level 10 just 7% base chance; assuming linear function
1923 if (victim->GetLevel() < 30)
1924 Probability = 0.65f * victim->GetLevel() + 0.5f;
1925
1926 uint32 VictimDefense = victim->GetDefenseSkillValue();
1927 uint32 AttackerMeleeSkill = GetUnitMeleeSkill();
1928
1929 // xinef: fix daze mechanics
1930 Probability -= ((float)VictimDefense - AttackerMeleeSkill) * 0.1428f;
1931
1932 if (Probability > 40.0f)
1933 Probability = 40.0f;
1934
1935 // Daze application
1936 if (sWorld->getBoolConfig(CONFIG_ENABLE_DAZE))
1937 if (roll_chance_f(std::max(0.0f, Probability)))
1938 CastSpell(victim, 1604, true);
1939 }
1940
1941 if (IsPlayer())
1942 ToPlayer()->CastItemCombatSpell(victim, damageInfo->attackType, damageInfo->procVictim, damageInfo->procEx);
1943
1944 // Do effect if any damage done to target
1945 if (damageInfo->damages[0].damage + damageInfo->damages[1].damage)
1946 {
1947 // We're going to call functions which can modify content of the list during iteration over it's elements
1948 // Let's copy the list so we can prevent iterator invalidation
1950 for (AuraEffectList::const_iterator dmgShieldItr = vDamageShieldsCopy.begin(); dmgShieldItr != vDamageShieldsCopy.end(); ++dmgShieldItr)
1951 {
1952 SpellInfo const* i_spellProto = (*dmgShieldItr)->GetSpellInfo();
1953 // Damage shield can be resisted...
1954 if (SpellMissInfo missInfo = victim->SpellHitResult(this, i_spellProto, false))
1955 {
1956 victim->SendSpellMiss(this, i_spellProto->Id, missInfo);
1957 continue;
1958 }
1959
1960 // ...or immuned
1961 if (IsImmunedToDamageOrSchool(i_spellProto))
1962 {
1963 victim->SendSpellDamageImmune(this, i_spellProto->Id);
1964 continue;
1965 }
1966
1967 uint32 damage = uint32(std::max(0, (*dmgShieldItr)->GetAmount())); // xinef: done calculated at amount calculation
1968
1969 if (Unit* caster = (*dmgShieldItr)->GetCaster())
1970 {
1971 damage = caster->SpellDamageBonusDone(this, i_spellProto, damage, SPELL_DIRECT_DAMAGE, (*dmgShieldItr)->GetEffIndex());
1972 damage = this->SpellDamageBonusTaken(caster, i_spellProto, damage, SPELL_DIRECT_DAMAGE);
1973 }
1974
1975 uint32 absorb = 0;
1976
1977 DamageInfo dmgInfo(victim, this, damage, i_spellProto, i_spellProto->GetSchoolMask(), SPELL_DIRECT_DAMAGE);
1978 Unit::CalcAbsorbResist(dmgInfo);
1979 absorb = dmgInfo.GetAbsorb();
1980 damage = dmgInfo.GetDamage();
1981
1982 Unit::DealDamageMods(this, damage, &absorb);
1983
1985 WorldPacket data(SMSG_SPELLDAMAGESHIELD, (8 + 8 + 4 + 4 + 4 + 4));
1986 data << victim->GetGUID();
1987 data << GetGUID();
1988 data << uint32(i_spellProto->Id);
1989 data << uint32(damage); // Damage
1990 int32 overkill = int32(damage) - int32(GetHealth());
1991 data << uint32(overkill > 0 ? overkill : 0); // Overkill
1992 data << uint32(i_spellProto->GetSchoolMask());
1993 victim->SendMessageToSet(&data, true);
1994
1995 Unit::DealDamage(victim, this, damage, 0, SPELL_DIRECT_DAMAGE, i_spellProto->GetSchoolMask(), i_spellProto, true);
1996 }
1997 }
1998}
@ EMOTE_ONESHOT_WOUND_CRITICAL
Definition: SharedDefines.h:1924
@ EMOTE_ONESHOT_PARRY_SHIELD
Definition: SharedDefines.h:1930
SpellMissInfo
Definition: SharedDefines.h:1518
@ CONFIG_ENABLE_DAZE
Definition: IWorld.h:185
@ CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN
Definition: CreatureData.h:48
@ SMSG_SPELLDAMAGESHIELD
Definition: Opcodes.h:621
bool isWorldBoss() const
Definition: Creature.h:120
bool HasFlagsExtra(uint32 flag) const
Definition: CreatureData.h:283
bool HasInArc(float arcangle, const Position *pos, float targetRadius=0.0f) const
Definition: Position.cpp:141
void CastItemCombatSpell(Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
Definition: Player.cpp:7210
uint32 GetUnitMeleeSkill(Unit const *target=nullptr) const
Definition: Unit.h:1112
void SendSpellMiss(Unit *target, uint32 spellID, SpellMissInfo missInfo)
Definition: Unit.cpp:6445
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition: Unit.cpp:3625
void SendSpellDamageImmune(Unit *target, uint32 spellId)
Definition: Unit.cpp:6469
SpellMissInfo SpellHitResult(Unit *victim, SpellInfo const *spell, bool canReflect=false)
Definition: Unit.cpp:3470
uint32 SpellDamageBonusTaken(Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
Definition: Unit.cpp:11791
void HandleEmoteCommand(uint32 emoteId)
Definition: Unit.cpp:2000
SpellSchoolMask GetSchoolMask() const
Definition: SpellInfo.cpp:1987

References CalcDamageInfo::absorb, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, CalcAbsorbResist(), Player::CastItemCombatSpell(), CastSpell(), CalcDamageInfo::cleanDamage, CONFIG_ENABLE_DAZE, CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, DealDamage(), DealDamageMods(), DIRECT_DAMAGE, EMOTE_ONESHOT_PARRY_SHIELD, EMOTE_ONESHOT_WOUND_CRITICAL, DamageInfo::GetAbsorb(), GetAttackTime(), getAttackTimer(), GetAuraEffectsByType(), Creature::GetCreatureTemplate(), DamageInfo::GetDamage(), GetDefenseSkillValue(), Object::GetGUID(), GetHealth(), GetLevel(), SpellInfo::GetSchoolMask(), GetUnitMeleeSkill(), HandleEmoteCommand(), HasActivePowerType(), CreatureTemplate::HasFlagsExtra(), Position::HasInArc(), HasOffhandWeaponForAttack(), HasUnitState(), CalcDamageInfo::HitInfo, HITINFO_CRITICALHIT, CalcDamageInfo::hitOutCome, SpellInfo::Id, IsAlive(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsImmunedToDamageOrSchool(), Object::IsPlayer(), IsVehicle(), Creature::isWorldBoss(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_GLANCING, MELEE_HIT_NORMAL, OFF_ATTACK, POWER_RAGE, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::resist, RewardRage(), roll_chance_f(), WorldObject::SendMessageToSet(), SendSpellDamageImmune(), SendSpellMiss(), setAttackTimer(), SMSG_SPELLDAMAGESHIELD, SPELL_AURA_DAMAGE_SHIELD, SPELL_DIRECT_DAMAGE, SpellDamageBonusTaken(), SpellHitResult(), sWorld, CalcDamageInfo::target, CalcDamageInfo::TargetState, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_IN_FLIGHT, VICTIMSTATE_BLOCKS, VICTIMSTATE_DODGE, and VICTIMSTATE_PARRY.

Referenced by AttackerStateUpdate(), and spell_dk_dancing_rune_weapon::HandleProc().

◆ DealSpellDamage()

void Unit::DealSpellDamage ( SpellNonMeleeDamage damageInfo,
bool  durabilityLoss,
Spell const *  spell = nullptr 
)
1439{
1440 if (damageInfo == 0)
1441 return;
1442
1443 Unit* victim = damageInfo->target;
1444
1445 if (!victim)
1446 return;
1447
1448 if (!victim->IsAlive() || victim->IsInFlight() || (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks()))
1449 return;
1450
1451 SpellInfo const* spellProto = damageInfo->spellInfo;
1452 if (!spellProto)
1453 {
1454 LOG_DEBUG("entities.unit", "Unit::DealSpellDamage has wrong damageInfo");
1455 return;
1456 }
1457
1458 // Call default DealDamage
1459 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->absorb, BASE_ATTACK, MELEE_HIT_NORMAL);
1460 Unit::DealDamage(this, victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss, false, spell);
1461}
SpellInfo const * spellInfo
Definition: Unit.h:497
bool IsInFlight() const
Definition: Unit.h:1572

References SpellNonMeleeDamage::absorb, BASE_ATTACK, SpellNonMeleeDamage::cleanDamage, SpellNonMeleeDamage::damage, DealDamage(), IsAlive(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsInFlight(), LOG_DEBUG, MELEE_HIT_NORMAL, SpellNonMeleeDamage::schoolMask, SPELL_DIRECT_DAMAGE, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, and Object::ToCreature().

Referenced by Spell::DoAllEffectOnTarget(), spell_sindragosa_s_fury::HandleDummy(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ DelayOwnedAuras()

void Unit::DelayOwnedAuras ( uint32  spellId,
ObjectGuid  caster,
int32  delaytime 
)
5463{
5464 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5465 for (; range.first != range.second; ++range.first)
5466 {
5467 Aura* aura = range.first->second;
5468 if (!caster || aura->GetCasterGUID() == caster)
5469 {
5470 if (aura->GetDuration() < delaytime)
5471 aura->SetDuration(0);
5472 else
5473 aura->SetDuration(aura->GetDuration() - delaytime);
5474
5475 // update for out of range group members (on 1 slot use)
5477 LOG_DEBUG("spells.aura", "Aura {} partially interrupted on unit {}, new duration: {} ms", aura->GetId(), GetGUID().ToString(), aura->GetDuration());
5478 }
5479 }
5480}
std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
Definition: Unit.h:637
int32 GetDuration() const
Definition: SpellAuras.h:133
void SetNeedClientUpdateForTargets() const
Definition: SpellAuras.cpp:1258
void SetDuration(int32 duration, bool withMods=false)
Definition: SpellAuras.cpp:868

References Aura::GetCasterGUID(), Aura::GetDuration(), Object::GetGUID(), Aura::GetId(), LOG_DEBUG, m_ownedAuras, Aura::SetDuration(), Aura::SetNeedClientUpdateForTargets(), and Position::ToString().

◆ DeleteCharmInfo()

void Unit::DeleteCharmInfo ( )
15821{
15822 if (!m_charmInfo)
15823 return;
15824
15826 delete m_charmInfo;
15827 m_charmInfo = nullptr;
15828}
void RestoreState()
Definition: CharmInfo.cpp:46

References m_charmInfo, and CharmInfo::RestoreState().

Referenced by RemoveCharmedBy().

◆ DeMorph()

void Unit::DeMorph ( )
4350{
4352}
virtual void SetDisplayId(uint32 modelId, float displayScale=1.f)
Definition: Unit.cpp:16763
uint32 GetNativeDisplayId() const
Definition: Unit.h:1839

References GetNativeDisplayId(), and SetDisplayId().

Referenced by modify_commandscript::HandleMorphResetCommand().

◆ DisableRotate()

void Unit::DisableRotate ( bool  apply)
18277{
18278 if (!IsCreature())
18279 return;
18280
18281 if (apply)
18285}
@ UNIT_STATE_POSSESSED
Definition: UnitDefines.h:165
void SetUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition: Unit.h:713

References HasUnitState(), Object::IsCreature(), RemoveUnitFlag(), SetUnitFlag(), UNIT_FLAG_POSSESSED, and UNIT_STATE_POSSESSED.

Referenced by boss_ingvar_the_plunderer::DamageTaken(), boss_thorim::boss_thorimAI::DisableThorim(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_anub_arak::boss_anub_arakAI::EnterEvadeMode(), boss_devourer_of_souls::boss_devourer_of_soulsAI::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::EnterEvadeMode(), boss_rotface::boss_rotfaceAI::EnterEvadeMode(), boss_varos::boss_varosAI::EnterEvadeMode(), boss_ignis::boss_ignisAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::EnterEvadeMode(), boss_ingvar_the_plunderer::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_devourer_of_souls::boss_devourer_of_soulsAI::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_ignis::boss_ignisAI::Reset(), boss_kologarn::boss_kologarnAI::Reset(), boss_ingvar_the_plunderer::Reset(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ DisableSpline()

◆ Dismount()

void Unit::Dismount ( )
13525{
13526 if (!IsMounted())
13527 return;
13528
13531
13532 if (Player* thisPlayer = ToPlayer())
13533 {
13534 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13535 data << GetPackGUID();
13536 data << uint32(GameTime::GetGameTime().count()); // Packet counter
13537 data << thisPlayer->GetCollisionHeight();
13538 thisPlayer->GetSession()->SendPacket(&data);
13539 }
13540
13541 WorldPacket data(SMSG_DISMOUNT, 8);
13542 data << GetPackGUID();
13543 SendMessageToSet(&data, true);
13544
13545 // dismount as a vehicle
13546 if (IsPlayer() && GetVehicleKit())
13547 {
13548 // Send other players that we are no longer a vehicle
13549 data.Initialize(SMSG_PLAYER_VEHICLE_DATA, 8 + 4);
13550 data << GetPackGUID();
13551 data << uint32(0);
13552 ToPlayer()->SendMessageToSet(&data, true);
13553 // Remove vehicle from player
13555 }
13556
13558
13559 // only resummon old pet if the player is already added to a map
13560 // this prevents adding a pet to a not created map which would otherwise cause a crash
13561 // (it could probably happen when logging in after a previous crash)
13562 if (Player* player = ToPlayer())
13563 {
13564 sScriptMgr->AnticheatSetUnderACKmount(player);
13565
13566 if (Pet* pPet = player->GetPet())
13567 {
13568 if (pPet->HasUnitFlag(UNIT_FLAG_STUNNED) && !pPet->HasUnitState(UNIT_STATE_STUNNED))
13569 pPet->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13570 }
13571 else
13572 player->ResummonPetTemporaryUnSummonedIfAny();
13573
13574 // xinef: if we have charmed npc, remove stun also
13575 if (Unit* charm = player->GetCharm())
13576 if (charm->IsCreature() && !charm->HasUnitState(UNIT_STATE_STUNNED))
13577 charm->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13578 }
13579}
@ AURA_INTERRUPT_FLAG_NOT_MOUNTED
Definition: SpellDefines.h:49
@ UNIT_FIELD_MOUNTDISPLAYID
Definition: UpdateFields.h:126
@ UNIT_FLAG_STUNNED
Definition: UnitDefines.h:247
@ UNIT_FLAG_MOUNT
Definition: UnitDefines.h:256
@ SMSG_PLAYER_VEHICLE_DATA
Definition: Opcodes.h:1221
@ SMSG_MOVE_SET_COLLISION_HGT
Definition: Opcodes.h:1332
@ SMSG_DISMOUNT
Definition: Opcodes.h:970
void SendMessageToSet(WorldPacket const *data, bool self) const override
Definition: Player.cpp:5665
void RemoveVehicleKit()
Definition: Unit.cpp:18728

References AURA_INTERRUPT_FLAG_NOT_MOUNTED, GetCharm(), GameTime::GetGameTime(), Object::GetPackGUID(), GetVehicleKit(), WorldPacket::Initialize(), IsMounted(), Object::IsPlayer(), RemoveAurasWithInterruptFlags(), RemoveUnitFlag(), RemoveVehicleKit(), WorldObject::SendMessageToSet(), Player::SendMessageToSet(), SetUInt32Value(), SMSG_DISMOUNT, SMSG_MOVE_SET_COLLISION_HGT, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, UNIT_FLAG_STUNNED, and UNIT_STATE_STUNNED.

Referenced by _EnterVehicle(), Player::CleanupAfterTaxiFlight(), FlightPathMovementGenerator::DoFinalize(), BattlegroundWS::EventPlayerClickedOnFlag(), AuraEffect::HandleAuraMounted(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), spell_mount_check_aura::HandleEffectPeriodic(), npc_scarlet_courier::npc_scarlet_courierAI::JustEngagedWith(), boss_mandokir::boss_mandokirAI::JustEngagedWith(), boss_captain_skarloc::MovementInform(), spell_chapter5_light_of_dawn_aura::OnApply(), Creature::setDeathState(), SetInCombatState(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), npc_magister_aledis::StartFight(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UnMountSelf(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), and npc_koltira_deathweaver::npc_koltira_deathweaverAI::WaypointReached().

◆ EnergizeBySpell()

void Unit::EnergizeBySpell ( Unit victim,
uint32  SpellID,
uint32  Damage,
Powers  powertype 
)
11272{
11273 int32 gainedPower = victim->ModifyPower(powerType, damage, false);
11274
11275 if (powerType != POWER_HAPPINESS && gainedPower)
11276 {
11277 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID);
11278 victim->getHostileRefMgr().threatAssist(this, float(gainedPower) * 0.5f, spellInfo);
11279 }
11280
11281 SendEnergizeSpellLog(victim, spellID, damage, powerType);
11282}
@ POWER_HAPPINESS
Definition: SharedDefines.h:273
void threatAssist(Unit *victim, float baseThreat, SpellInfo const *threatSpell=nullptr)
Definition: HostileRefMgr.cpp:35
void SendEnergizeSpellLog(Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
Definition: Unit.cpp:11260

References getHostileRefMgr(), ModifyPower(), POWER_HAPPINESS, SendEnergizeSpellLog(), sSpellMgr, and HostileRefMgr::threatAssist().

Referenced by Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerDrain(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ EnterVehicle()

void Unit::EnterVehicle ( Unit base,
int8  seatId = -1 
)
19641{
19643
19644 if (Player* player = ToPlayer())
19645 {
19646 sScriptMgr->AnticheatSetUnderACKmount(player);
19647 }
19648}
@ TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE
Will ignore caster aura states including combat requirements and death state.
Definition: SpellDefines.h:146
@ VEHICLE_SPELL_RIDE_HARDCODED
Definition: VehicleDefines.h:52

References CastCustomSpell(), SPELLVALUE_BASE_POINT0, sScriptMgr, Object::ToPlayer(), TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE, and VEHICLE_SPELL_RIDE_HARDCODED.

Referenced by debug_commandscript::HandleDebugEnterVehicleCommand(), WorldSession::HandleEnterPlayerVehicle(), boss_mimiron::boss_mimironAI::JustEngagedWith(), npc_pilgrims_bounty_chair::UpdateAI(), and boss_mimiron::boss_mimironAI::UpdateAI().

◆ EnterVehicleUnattackable()

void Unit::EnterVehicleUnattackable ( Unit base,
int8  seatId = -1 
)

◆ ExecuteDelayedUnitAINotifyEvent()

void Unit::ExecuteDelayedUnitAINotifyEvent ( )
20512{
20514 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20515 return;
20516
20517 Acore::AIRelocationNotifier notifier(*this);
20518 float radius = 60.0f;
20519 Cell::VisitAllObjects(this, notifier, radius);
20520}
@ NOTIFY_AI_RELOCATION
Definition: Object.h:66
void RemoveFromNotify(uint16 f)
Definition: Object.h:567
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition: CellImpl.h:206
Definition: GridNotifiers.h:91

References IsDuringRemoveFromWorld(), Object::IsInWorld(), NOTIFY_AI_RELOCATION, WorldObject::RemoveFromNotify(), and Cell::VisitAllObjects().

Referenced by Update().

◆ ExecuteDelayedUnitRelocationEvent()

void Unit::ExecuteDelayedUnitRelocationEvent ( )
20405{
20407 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20408 return;
20409
20410 if (this->HasSharedVision())
20411 for (SharedVisionList::const_iterator itr = this->GetSharedVisionList().begin(); itr != this->GetSharedVisionList().end(); ++itr)
20412 if (Player* player = (*itr))
20413 {
20414 if (player->IsOnVehicle(this) || !player->IsInWorld() || player->IsDuringRemoveFromWorld()) // players on vehicles have their own event executed (due to passenger relocation)
20415 continue;
20416 WorldObject* viewPoint = player;
20417 if (player->m_seer && player->m_seer->IsInWorld())
20418 viewPoint = player->m_seer;
20419 if (!viewPoint->IsPositionValid() || !player->IsPositionValid())
20420 continue;
20421
20422 if (Unit* active = viewPoint->ToUnit())
20423 {
20424 //if (active->IsVehicle()) // always check original unit here, last notify position is not relocated
20425 // active = player;
20426
20427 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20428 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20429 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20430 float distsq = dx * dx + dy * dy + dz * dz;
20431 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20432 if (distsq < mindistsq)
20433 continue;
20434
20435 // this will be relocated below sharedvision!
20436 //active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20437 }
20438
20439 Acore::PlayerRelocationNotifier relocateNoLarge(*player, false); // visit only objects which are not large; default distance
20440 Cell::VisitAllObjects(viewPoint, relocateNoLarge, player->GetSightRange() + VISIBILITY_INC_FOR_GOBJECTS);
20441 relocateNoLarge.SendToSelf();
20442 Acore::PlayerRelocationNotifier relocateLarge(*player, true); // visit only large objects; maximum distance
20443 Cell::VisitAllObjects(viewPoint, relocateLarge, MAX_VISIBILITY_DISTANCE);
20444 relocateLarge.SendToSelf();
20445 }
20446
20447 if (Player* player = this->ToPlayer())
20448 {
20449 WorldObject* viewPoint = player;
20450 if (player->m_seer && player->m_seer->IsInWorld())
20451 viewPoint = player->m_seer;
20452
20453 if (viewPoint->GetMapId() != player->GetMapId() || !viewPoint->IsPositionValid() || !player->IsPositionValid())
20454 return;
20455
20456 if (Unit* active = viewPoint->ToUnit())
20457 {
20458 if (active->IsVehicle())
20459 active = player;
20460
20461 if (!player->GetFarSightDistance())
20462 {
20463 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20464 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20465 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20466 float distsq = dx * dx + dy * dy + dz * dz;
20467
20468 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20469 if (distsq < mindistsq)
20470 return;
20471
20472 active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20473 }
20474 }
20475
20476 Acore::PlayerRelocationNotifier relocateNoLarge(*player, false); // visit only objects which are not large; default distance
20477 Cell::VisitAllObjects(viewPoint, relocateNoLarge, player->GetSightRange() + VISIBILITY_INC_FOR_GOBJECTS);
20478 relocateNoLarge.SendToSelf();
20479
20480 if (!player->GetFarSightDistance())
20481 {
20482 Acore::PlayerRelocationNotifier relocateLarge(*player, true); // visit only large objects; maximum distance
20483 Cell::VisitAllObjects(viewPoint, relocateLarge, MAX_VISIBILITY_DISTANCE);
20484 relocateLarge.SendToSelf();
20485 }
20486
20488 }
20489 else if (Creature* unit = this->ToCreature())
20490 {
20491 if (!unit->IsPositionValid())
20492 return;
20493
20494 float dx = unit->m_last_notify_position.GetPositionX() - unit->GetPositionX();
20495 float dy = unit->m_last_notify_position.GetPositionY() - unit->GetPositionY();
20496 float dz = unit->m_last_notify_position.GetPositionZ() - unit->GetPositionZ();
20497 float distsq = dx * dx + dy * dy + dz * dz;
20498 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(unit->FindMap()->GetEntry()->map_type);
20499 if (distsq < mindistsq)
20500 return;
20501
20502 unit->m_last_notify_position.Relocate(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ());
20503
20504 Acore::CreatureRelocationNotifier relocate(*unit);
20505 Cell::VisitAllObjects(unit, relocate, unit->GetVisibilityRange() + VISIBILITY_COMPENSATION);
20506
20508 }
20509}
#define MAX_VISIBILITY_DISTANCE
Definition: ObjectDefines.h:31
#define VISIBILITY_INC_FOR_GOBJECTS
Definition: ObjectDefines.h:28
#define VISIBILITY_COMPENSATION
Definition: ObjectDefines.h:26
@ NOTIFY_VISIBILITY_CHANGED
Definition: Object.h:67
Unit * ToUnit()
Definition: Object.h:206
void AddToNotify(uint16 f)
Definition: Object.cpp:2978
bool IsPositionValid() const
Definition: Position.cpp:176
uint32 GetMapId() const
Definition: Position.h:275
SharedVisionList const & GetSharedVisionList()
Definition: Unit.h:1737
bool HasSharedVision() const
Definition: Unit.h:1740
Definition: GridNotifiers.h:75
Definition: GridNotifiers.h:83
static float GetReqMoveDistSq(uint32 map_type)
Definition: DynamicVisibility.h:53

References WorldObject::AddToNotify(), WorldLocation::GetMapId(), Position::GetPositionX(), DynamicVisibilityMgr::GetReqMoveDistSq(), GetSharedVisionList(), HasSharedVision(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Position::IsPositionValid(), MAX_VISIBILITY_DISTANCE, NOTIFY_AI_RELOCATION, NOTIFY_VISIBILITY_CHANGED, WorldObject::RemoveFromNotify(), Acore::VisibleNotifier::SendToSelf(), Object::ToCreature(), Object::ToPlayer(), Object::ToUnit(), VISIBILITY_COMPENSATION, VISIBILITY_INC_FOR_GOBJECTS, and Cell::VisitAllObjects().

◆ ExitVehicle()

void Unit::ExitVehicle ( Position const *  exitPosition = nullptr)

This function can be called at upper level code to initialize an exit from the passenger's side.

The following call would not even be executed successfully as the SPELL_AURA_CONTROL_VEHICLE unapply handler already calls _ExitVehicle without specifying an exitposition. The subsequent call below would return on if (!m_vehicle).

To do: We need to allow SPELL_AURA_CONTROL_VEHICLE unapply handlers in spellscripts to specify exit coordinates and either store those per passenger, or we need to init spline movement based on those coordinates in unapply handlers, and relocate exiting passengers based on Unit::moveSpline data. Either way, Coming Soon(TM)

19737{
19739 if (!m_vehicle)
19740 return;
19741
19743 if (Player* player = ToPlayer())
19744 {
19745 player->SetCanTeleport(true);
19746 }
19750 /*_ExitVehicle(exitPosition);*/
19757
19758 if (Player* player = ToPlayer())
19759 {
19760 sScriptMgr->AnticheatSetUnderACKmount(player);
19761 }
19762}
Unit * GetVehicleBase() const
Definition: Unit.cpp:18743

References Object::GetGUID(), GetVehicleBase(), m_vehicle, RemoveAurasByType(), SPELL_AURA_CONTROL_VEHICLE, sScriptMgr, and Object::ToPlayer().

Referenced by _EnterVehicle(), Player::ActivateTaxiPathTo(), boss_mimiron::boss_mimironAI::EnterEvadeMode(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::EnterEvadeMode(), npc_ulduar_vx001::npc_ulduar_vx001AI::EnterEvadeMode(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::EnterEvadeMode(), WorldSession::HandleDismissControlledVehicle(), spell_warhead_detonate::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_ulduar_squeezed_lifeless::HandleInstaKill(), WorldSession::HandleRequestVehicleExit(), spell_vehicle_throw_passenger::HandleScript(), boss_kologarn_arms::boss_kologarn_armsAI::JustDied(), Player::ProcessDelayedOperations(), RemoveFromWorld(), Player::StopCastingCharm(), and Player::TeleportTo().

◆ FindCurrentSpellBySpellId()

◆ FinishSpell()

void Unit::FinishSpell ( CurrentSpellTypes  spellType,
bool  ok = true 
)
4088{
4089 Spell* spell = m_currentSpells[spellType];
4090 if (!spell)
4091 return;
4092
4093 if (spellType == CURRENT_CHANNELED_SPELL)
4094 spell->SendChannelUpdate(0);
4095
4096 spell->finish(ok);
4097}
void SendChannelUpdate(uint32 time)
Definition: Spell.cpp:5196

References CURRENT_CHANNELED_SPELL, Spell::finish(), m_currentSpells, and Spell::SendChannelUpdate().

Referenced by AuraEffect::HandleFeignDeath(), AuraEffect::HandleModStealth(), npc_risen_archmage::npc_risen_archmageAI::JustEngagedWith(), boss_lord_marrowgar::UpdateAI(), and GameObject::Use().

◆ GetAffectingPlayer()

Player * Unit::GetAffectingPlayer ( ) const
10626{
10627 if (!GetCharmerOrOwnerGUID())
10628 return const_cast<Unit*>(this)->ToPlayer();
10629
10630 if (Unit* owner = GetCharmerOrOwner())
10632
10633 return nullptr;
10634}
Unit * GetCharmerOrOwner() const
Definition: Unit.h:1211
ObjectGuid GetCharmerOrOwnerGUID() const
Definition: Unit.h:1220

References GetCharmerOrOwner(), GetCharmerOrOwnerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), and Object::ToPlayer().

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), GetDispellableAuraList(), GetFactionReactionTo(), and GetReactionTo().

◆ GetAI()

UnitAI * Unit::GetAI ( )
inline
658{ return i_AI; }

References i_AI.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), spell_algalon_big_bang::CheckTargets(), DealDamage(), DealHeal(), spell_send_mug_target_picker::FilterTargets(), spell_blood_queen_bloodbolt::FilterTargets(), npc_dream_fog::npc_dream_fogAI::GetRandomUnitFromDragonThreatList(), BattlegroundIC::HandleCapturedNodes(), spell_send_mug_target_picker::HandleDummy(), spell_magtheridon_shadow_grasp_visual::HandleDummyApply(), spell_mount_check_aura::HandleEffectPeriodic(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_random_aggro::HandleOnHit(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_frostwarden_handler_focus_fire::HandleScript(), spell_ayamiss_swarmer_start_loop::HandleScript(), spell_pursue::HandleScript(), spell_xt002_gravity_bomb_damage::HandleScript(), spell_the_lich_king_quake::HandleSendEvent(), npc_risen_guardian::npc_risen_guardianAI::IsSummonedBy(), npc_risen_guardian::npc_risen_guardianAI::KilledUnit(), ModifyPower(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), achievement_respect_your_elders::OnCheck(), achievement_hadronox_denied::OnCheck(), achievement_watch_him_die::OnCheck(), achievement_better_off_dred::OnCheck(), achievement_oh_novos::OnCheck(), achievement_share_the_love::OnCheck(), achievement_snakes_whyd_it_have_to_be_snakes::OnCheck(), achievement_im_on_a_boat::OnCheck(), achievement_all_you_can_eat::OnCheck(), achievement_been_waiting_long_time::OnCheck(), achievement_neck_deep_in_vile::OnCheck(), achievement_portal_jockey::OnCheck(), achievement_chaos_theory::OnCheck(), achievement_split_personality::OnCheck(), achievement_algalon_he_feeds_on_your_tears::OnCheck(), achievement_algalon_herald_of_the_titans::OnCheck(), achievement_flame_leviathan_towers::OnCheck(), achievement_flame_leviathan_shutout::OnCheck(), achievement_freya_getting_back_to_nature::OnCheck(), achievement_freya_knock_on_wood::OnCheck(), achievement_yogg_saron_drive_me_crazy::OnCheck(), achievement_yogg_saron_kiss_and_make_up::OnCheck(), achievement_intense_cold::OnCheck(), achievement_once_bitten_twice_shy::OnCheck(), spell_xt002_gravity_bomb_aura::OnPeriodic(), spell_marrowgar_coldflame::SelectTarget(), and boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::SpellHit().

◆ GetAllMinionsByEntry()

void Unit::GetAllMinionsByEntry ( std::list< Creature * > &  Minions,
uint32  entry 
)
10852{
10853 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
10854 {
10855 Unit* unit = *itr;
10856 ++itr;
10857 if (unit->GetEntry() == entry && unit->IsCreature()
10858 && unit->ToCreature()->IsSummon()) // minion, actually
10859 Minions.push_back(unit->ToCreature());
10860 }
10861}
bool IsSummon() const
Definition: Unit.h:751

References Object::GetEntry(), Object::IsCreature(), IsSummon(), m_Controlled, and Object::ToCreature().

Referenced by spell_item_gift_of_the_harvester::CheckRequirement().

◆ GetAPMultiplier()

float Unit::GetAPMultiplier ( WeaponAttackType  attType,
bool  normalized 
)
17220{
17221 if (!normalized || !IsPlayer())
17222 return float(GetAttackTime(attType)) / 1000.0f;
17223
17224 Item* Weapon = ToPlayer()->GetWeaponForAttack(attType, true);
17225 if (!Weapon)
17226 return 2.4f; // fist attack
17227
17228 switch (Weapon->GetTemplate()->InventoryType)
17229 {
17230 case INVTYPE_2HWEAPON:
17231 return 3.3f;
17232 case INVTYPE_RANGED:
17234 case INVTYPE_THROWN:
17235 return 2.8f;
17236 case INVTYPE_WEAPON:
17239 default:
17240 return Weapon->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER ? 1.7f : 2.4f;
17241 }
17242}
Weapon
Definition: boss_arlokk.cpp:76
@ ITEM_SUBCLASS_WEAPON_DAGGER
Definition: ItemTemplate.h:359
@ INVTYPE_RANGED
Definition: ItemTemplate.h:271
@ INVTYPE_THROWN
Definition: ItemTemplate.h:281
@ INVTYPE_RANGEDRIGHT
Definition: ItemTemplate.h:282
@ INVTYPE_WEAPON
Definition: ItemTemplate.h:269
@ INVTYPE_WEAPONMAINHAND
Definition: ItemTemplate.h:277
@ INVTYPE_WEAPONOFFHAND
Definition: ItemTemplate.h:278
@ INVTYPE_2HWEAPON
Definition: ItemTemplate.h:273
Definition: Item.h:220
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
Definition: PlayerStorage.cpp:488

References GetAttackTime(), Player::GetWeaponForAttack(), INVTYPE_2HWEAPON, INVTYPE_RANGED, INVTYPE_RANGEDRIGHT, INVTYPE_THROWN, INVTYPE_WEAPON, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND, Object::IsPlayer(), ITEM_SUBCLASS_WEAPON_DAGGER, and Object::ToPlayer().

Referenced by Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), and MeleeDamageBonusDone().

◆ GetAppliedAuras() [1/2]

◆ GetAppliedAuras() [2/2]

AuraApplicationMap const & Unit::GetAppliedAuras ( ) const
inline
1305{ return m_appliedAuras; }

References m_appliedAuras.

◆ GetArmor()

◆ getAttackerForHelper()

Unit * Unit::getAttackerForHelper ( ) const
741{
742 if (GetVictim() != nullptr)
743 return GetVictim();
744
745 if (!IsEngaged())
746 return nullptr;
747
748 if (!m_attackers.empty())
749 return *(m_attackers.begin());
750
751 return nullptr;
752}
bool IsEngaged() const
Definition: Unit.h:881
Unit * GetVictim() const
Definition: Unit.h:853

References GetVictim(), IsEngaged(), and m_attackers.

Referenced by Creature::_IsTargetAcceptable(), Creature::CanStartAttack(), npc_clintar_spirit::npc_clintar_spiritAI::EnterEvadeMode(), PetAI::SelectNextTarget(), Creature::SelectVictim(), SetControlled(), TotemAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), and PetAI::UpdateAI().

◆ getAttackers()

◆ GetAttackTime()

◆ getAttackTimer()

◆ GetAura()

Aura * Unit::GetAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5582{
5583 AuraApplication* aurApp = GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask);
5584 return aurApp ? aurApp->GetBase() : nullptr;
5585}
AuraApplication * GetAuraApplication(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition: Unit.cpp:5562

References GetAuraApplication(), and AuraApplication::GetBase().

Referenced by Player::_addSpell(), Pet::addSpell(), spell_mage_burning_determination::CheckProc(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), boss_freya::boss_freyaAI::DoAction(), Spell::DoTriggersOnSpellHit(), Spell::EffectScriptEffect(), Spell::EffectTitanGrip(), Spell::EffectWeaponDmg(), getOrphanGUID(), spell_dk_scourge_strike::HandleAfterHit(), spell_warl_seduction::HandleAuraApply(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraLinked(), Aura::HandleAuraSpecificMods(), misc_commandscript::HandleAuraStacksCommand(), deserter_commandscript::HandleDeserterAdd(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_charge_shield_bomber::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), HandleDummyAuraProc(), spell_yogg_saron_sanity_well_aura::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_hodir_flash_freeze_aura::HandleEffectPeriodic(), spell_sindragosa_frost_breath::HandleInfusion(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_putricide_unstable_experiment::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_eat_ooze::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_yogg_saron_sanity_reduce::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_pal_seal_of_vengeance::HandleScriptEffect(), spell_pri_lightwell::HandleScriptEffect(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::InitializeAI(), npc_spiritual_insight::npc_spiritual_insightAI::IsSummonedBy(), npc_gunship::npc_gunshipAI::JustDied(), boss_high_nethermancer_zerevor::JustEngagedWith(), npc_brew_bubble::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), spell_summoning_rhyme_aura::PeriodicTick(), Player::ProcessDelayedOperations(), BattlefieldWG::PromotePlayer(), RemoveAurasDueToSpellBySteal(), Player::ResurrectPlayer(), SetAuraStack(), boss_anomalus::SetData(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_pilgrims_bounty_chair::SpellHit(), boss_jaraxxus::boss_jaraxxusAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), boss_sindragosa::boss_sindragosaAI::SpellHitTarget(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::SpellHitTarget(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::SpellHitTarget(), npc_twilight_summon::npc_twilight_summonAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), and Player::UpdateTitansGrip().

◆ GetAuraApplication()

AuraApplication * Unit::GetAuraApplication ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraApplication except = nullptr 
) const
5563{
5564 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5565 for (; range.first != range.second; ++range.first)
5566 {
5567 AuraApplication* app = range.first->second;
5568 Aura const* aura = app->GetBase();
5569
5570 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
5571 && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5572 && (!itemCasterGUID || aura->GetCastItemGUID() == itemCasterGUID)
5573 && (!except || except != app))
5574 {
5575 return app;
5576 }
5577 }
5578 return nullptr;
5579}
std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
Definition: Unit.h:640
uint8 GetEffectMask() const
Definition: SpellAuras.h:176
ObjectGuid GetCastItemGUID() const
Definition: SpellAuras.h:103

References AuraApplication::GetBase(), Aura::GetCasterGUID(), Aura::GetCastItemGUID(), Aura::GetEffectMask(), and m_appliedAuras.

Referenced by AuraApplication::_Remove(), GetAura(), GetAuraApplicationOfRankedSpell(), HasAura(), and Spell::UpdateChanneledTargetList().

◆ GetAuraApplicationOfRankedSpell()

AuraApplication * Unit::GetAuraApplicationOfRankedSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraApplication except = nullptr 
) const
5588{
5589 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5590 while (rankSpell)
5591 {
5592 if (AuraApplication* aurApp = GetAuraApplication(rankSpell, casterGUID, itemCasterGUID, reqEffMask, except))
5593 return aurApp;
5594 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5595 }
5596 return nullptr;
5597}

References GetAuraApplication(), and sSpellMgr.

Referenced by spell_warl_drain_soul::CheckProc(), and GetAuraOfRankedSpell().

◆ GetAuraCount()

uint32 Unit::GetAuraCount ( uint32  spellId) const
5683{
5684 uint32 count = 0;
5685 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5686
5687 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5688 {
5689 if (itr->second->GetBase()->GetStackAmount() == 0)
5690 ++count;
5691 else
5692 count += (uint32)itr->second->GetBase()->GetStackAmount();
5693 }
5694
5695 return count;
5696}

References m_appliedAuras.

Referenced by npc_brew_bubble::MoveInLineOfSight(), spell_valithria_suppression_aura::OnApply(), achievement_consumption_junction::OnCheck(), achievement_assembly_of_iron::OnCheck(), achievement_cant_do_that_while_stunned::OnCheck(), spell_valithria_suppression_aura::OnRemove(), SmartScript::ProcessEvent(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), spell_black_temple_spell_absorption_aura::Update(), and npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI().

◆ GetAuraEffect() [1/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5535{
5536 AuraEffectList const& auras = GetAuraEffectsByType(type);
5537 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5538 {
5539 SpellInfo const* spell = (*i)->GetSpellInfo();
5540 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5541 {
5542 if (casterGUID && (*i)->GetCasterGUID() != casterGUID)
5543 continue;
5544 return (*i);
5545 }
5546 }
5547 return nullptr;
5548}
bool HasFlag(uint32 p1=0, uint32 p2=0, uint32 p3=0) const
Definition: Util.h:468
flag96 SpellFamilyFlags
Definition: SpellInfo.h:388
uint32 SpellFamilyName
Definition: SpellInfo.h:387

References GetAuraEffectsByType(), flag96::HasFlag(), SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

◆ GetAuraEffect() [2/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  name,
uint32  iconId,
uint8  effIndex 
) const
5521{
5522 AuraEffectList const& auras = GetAuraEffectsByType(type);
5523 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5524 {
5525 if (effIndex != (*itr)->GetEffIndex())
5526 continue;
5527 SpellInfo const* spell = (*itr)->GetSpellInfo();
5528 if (spell->SpellIconID == iconId && spell->SpellFamilyName == name)
5529 return *itr;
5530 }
5531 return nullptr;
5532}
uint32 SpellIconID
Definition: SpellInfo.h:380

References GetAuraEffectsByType(), SpellInfo::SpellFamilyName, and SpellInfo::SpellIconID.

◆ GetAuraEffect() [3/3]

AuraEffect * Unit::GetAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5495{
5496 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5497 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5498 {
5499 if (itr->second->HasEffect(effIndex)
5500 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5501 {
5502 return itr->second->GetBase()->GetEffect(effIndex);
5503 }
5504 }
5505 return nullptr;
5506}

References m_appliedAuras.

Referenced by CalculateSpellAmount(), Spell::CanAutoCast(), spell_mage_ice_barrier::CheckCast(), spell_pri_power_word_shield::CheckCast(), spell_mage_molten_armor::CheckProc(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectWeaponDmg(), spell_dru_t10_restoration_4p_bonus::FilterTargets(), GetAuraEffectOfRankedSpell(), GetDummyAuraEffect(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), spell_dk_raise_ally::HandleDummy(), spell_dk_death_coil::HandleDummy(), spell_dk_death_strike::HandleDummy(), spell_dk_scourge_strike::HandleDummy(), spell_warl_life_tap::HandleDummy(), HandleDummyAuraProc(), spell_warr_execute::HandleEffect(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blessing_of_ancient_kings::HandleProc(), spell_pal_sacred_shield_base::HandleProc(), spell_pri_divine_aegis::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleShapeshiftBoosts(), spell_warl_drain_soul::HandleTick(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::InitializeAI(), Guardian::InitStatsForLevel(), npc_anzu_spirit::IsSummonedBy(), MeleeDamageBonusDone(), ModSpellDuration(), spell_dk_death_and_decay::RecalculateDamage(), RemoveAurasDueToSpellByDispel(), SpellDamageBonusDone(), SpellHealingBonusTaken(), npc_soh_fire_trigger::SpellHit(), npc_hallows_end_train_fire::SpellHit(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), SpellTakenCritChance(), spell_mage_incanters_absorbtion_base_AuraScript::Trigger(), and npc_hallows_end_train_fire::UpdateAI().

◆ GetAuraEffectDummy()

AuraEffect * Unit::GetAuraEffectDummy ( uint32  spellid) const
5551{
5553 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5554 {
5555 if ((*itr)->GetId() == spellid)
5556 return *itr;
5557 }
5558
5559 return nullptr;
5560}
@ SPELL_AURA_DUMMY
Definition: SpellAuraDefines.h:67

References GetAuraEffectsByType(), and SPELL_AURA_DUMMY.

Referenced by Spell::EffectWeaponDmg(), Aura::HandleAuraSpecificMods(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_dk_scourge_strike::HandleDummy(), Guardian::InitStatsForLevel(), Kill(), spell_dk_death_and_decay::RecalculateDamage(), Player::RemoveSpellMods(), and SpellHealingBonusTaken().

◆ GetAuraEffectOfRankedSpell()

AuraEffect * Unit::GetAuraEffectOfRankedSpell ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5509{
5510 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5511 while (rankSpell)
5512 {
5513 if (AuraEffect* aurEff = GetAuraEffect(rankSpell, effIndex, caster))
5514 return aurEff;
5515 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5516 }
5517 return nullptr;
5518}
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition: Unit.cpp:5494

References GetAuraEffect(), and sSpellMgr.

Referenced by spell_mage_fire_frost_ward::Absorb(), spell_sha_earthbind_totem::Apply(), spell_sha_earthliving_weapon::CheckProc(), spell_dru_enrage::HandleApply(), spell_pal_avenging_wrath::HandleApply(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), SpellPctDamageModsDone(), and spell_mage_incanters_absorbtion_base_AuraScript::Trigger().

◆ GetAuraEffectsByType()

AuraEffectList const & Unit::GetAuraEffectsByType ( AuraType  type) const
inline
1349{ return m_modAuras[type]; }

References m_modAuras.

Referenced by Player::_ApplyWeaponDependentAuraMods(), Spell::_cast(), AuraApplication::_HandleEffect(), KillRewarder::_RewardXP(), CalcAbsorbResist(), CalcArmorReducedDamage(), CalcHealAbsorb(), AuraEffect::CalculateAmount(), Player::CalculateQuestRewardXP(), Spell::CheckCast(), Spell::CheckCasterAuras(), DealDamage(), DealMeleeDamage(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), spell_dk_wandering_plague::FilterTargets(), GetAuraEffect(), GetAuraEffectDummy(), GetDoTsByCaster(), GetMagicHitRedirectTarget(), GetMaxNegativeAuraModifier(), GetMaxNegativeAuraModifierByAffectMask(), GetMaxNegativeAuraModifierByMiscMask(), GetMaxNegativeAuraModifierByMiscValue(), GetMaxPositiveAuraModifier(), GetMaxPositiveAuraModifierByAffectMask(), GetMaxPositiveAuraModifierByMiscMask(), GetMaxPositiveAuraModifierByMiscValue(), Player::getMaxTimer(), GetMeleeHitRedirectTarget(), GetPhaseByAuras(), Player::GetResurrectionSpellId(), Player::GetRuneBaseCooldown(), GetTotalAuraModifier(), GetTotalAuraModifierAreaExclusive(), GetTotalAuraModifierByAffectMask(), GetTotalAuraModifierByMiscMask(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByAffectMask(), GetTotalAuraMultiplierByMiscMask(), GetTotalAuraMultiplierByMiscValue(), GetUnitCriticalChance(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModSchoolImmunity(), Aura::HandleAuraSpecificMods(), AuraEffect::HandleAuraTransform(), AuraEffect::HandleDetectAmore(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), HandleDummyAuraProc(), Spell::HandleLaunchPhase(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleMirrorImageDataRequest(), AuraEffect::HandleModInvisibility(), modify_commandscript::HandleMorphMountCommand(), AuraEffect::HandleNoReagentUseAura(), spell_illidari_council_judgement::HandleScriptEffect(), spell_pal_judgement::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), HasAuraState(), HasAuraTypeWithAffectMask(), HasAuraTypeWithCaster(), HasAuraTypeWithFamilyFlags(), HasAuraTypeWithMiscvalue(), HasAuraTypeWithTriggerSpell(), HasAuraTypeWithValue(), HasBreakableByDamageAuraType(), HasVisibleAuraType(), IsImmunedToSpellEffect(), IsScriptOverriden(), SpellInfo::IsStrongerAuraActive(), Player::isTotalImmune(), list_commandscript::ListAurasCommand(), MeleeDamageBonusDone(), MeleeDamageBonusTaken(), MeleeSpellHitResult(), Spell::PrepareTriggersExecutedOnHit(), processDummyAuras(), spell_dru_enrage::RecalculateBaseArmor(), Creature::Regenerate(), Player::Regenerate(), Player::RegenerateAll(), Creature::RegenerateHealth(), Player::RegenerateHealth(), Creature::Respawn(), RestoreDisplayId(), Spell::SelectImplicitAreaTargets(), Spell::SelectImplicitConeTargets(), PetAI::SelectNextTarget(), Creature::SelectVictim(), Player::SendInitialPacketsAfterAddToMap(), SetControlled(), Player::SetEntryPoint(), Player::SetSkill(), SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SpellBaseHealingBonusDone(), SpellBaseHealingBonusTaken(), SpellDamageBonusDone(), SpellDamageBonusTaken(), SpellHealingBonusDone(), SpellHealingBonusTaken(), SpellHitResult(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), SpellTakenCritChance(), Player::SummonPet(), Player::TeleportTo(), SimpleCharmedAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), Player::UpdateArmor(), Player::UpdateAttackPowerAndDamage(), Player::UpdateCharmedAI(), Player::UpdateExpertise(), Player::UpdateManaRegen(), Player::UpdateRating(), Player::UpdateResistances(), UpdateSpeed(), and Player::UpdateStats().

◆ GetAuraOfRankedSpell()

Aura * Unit::GetAuraOfRankedSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5600{
5601 AuraApplication* aurApp = GetAuraApplicationOfRankedSpell(spellId, casterGUID, itemCasterGUID, reqEffMask);
5602 return aurApp ? aurApp->GetBase() : nullptr;
5603}
AuraApplication * GetAuraApplicationOfRankedSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition: Unit.cpp:5587

References GetAuraApplicationOfRankedSpell(), and AuraApplication::GetBase().

Referenced by Aura::HandleAuraSpecificMods().

◆ GetCastingTimeForBonus()

uint32 Unit::GetCastingTimeForBonus ( SpellInfo const *  spellProto,
DamageEffectType  damagetype,
uint32  CastingTime 
) const
17080{
17081 // Not apply this to creature casted spells with casttime == 0
17082 if (CastingTime == 0 && IsCreature() && !IsPet())
17083 return 3500;
17084
17085 if (CastingTime > 7000) CastingTime = 7000;
17086 if (CastingTime < 1500) CastingTime = 1500;
17087
17088 if (damagetype == DOT && !spellProto->IsChanneled())
17089 CastingTime = 3500;
17090
17091 int32 overTime = 0;
17092 uint8 effects = 0;
17093 bool DirectDamage = false;
17094 bool AreaEffect = false;
17095
17096 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; i++)
17097 {
17098 switch (spellProto->Effects[i].Effect)
17099 {
17105 case SPELL_EFFECT_HEAL:
17106 DirectDamage = true;
17107 break;
17109 switch (spellProto->Effects[i].ApplyAuraName)
17110 {
17114 if (spellProto->GetDuration())
17115 overTime = spellProto->GetDuration();
17116 break;
17117 default:
17118 // -5% per additional effect
17119 ++effects;
17120 break;
17121 }
17122 default:
17123 break;
17124 }
17125
17126 if (spellProto->Effects[i].IsTargetingArea())
17127 AreaEffect = true;
17128 }
17129
17130 // Combined Spells with Both Over Time and Direct Damage
17131 if (overTime > 0 && DirectDamage)
17132 {
17133 // mainly for DoTs which are 3500 here otherwise
17134 uint32 OriginalCastTime = spellProto->CalcCastTime();
17135 if (OriginalCastTime > 7000) OriginalCastTime = 7000;
17136 if (OriginalCastTime < 1500) OriginalCastTime = 1500;
17137 // Portion to Over Time
17138 float PtOT = (overTime / 15000.0f) / ((overTime / 15000.0f) + (OriginalCastTime / 3500.0f));
17139
17140 if (damagetype == DOT)
17141 CastingTime = uint32(CastingTime * PtOT);
17142 else if (PtOT < 1.0f)
17143 CastingTime = uint32(CastingTime * (1 - PtOT));
17144 else
17145 CastingTime = 0;
17146 }
17147
17148 // Area Effect Spells receive only half of bonus
17149 if (AreaEffect)
17150 CastingTime /= 2;
17151
17152 // 50% for damage and healing spells for leech spells from damage bonus and 0% from healing
17153 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
17154 {
17155 if (spellProto->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH ||
17156 (spellProto->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA && spellProto->Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_LEECH))
17157 {
17158 CastingTime /= 2;
17159 break;
17160 }
17161 }
17162
17163 // -5% of total per any additional effect
17164 for (uint8 i = 0; i < effects; ++i)
17165 CastingTime *= 0.95f;
17166
17167 return CastingTime;
17168}
@ SPELL_EFFECT_POWER_BURN
Definition: SharedDefines.h:840
@ SPELL_EFFECT_HEALTH_LEECH
Definition: SharedDefines.h:787
@ SPELL_EFFECT_HEAL
Definition: SharedDefines.h:788
@ SPELL_EFFECT_ENVIRONMENTAL_DAMAGE
Definition: SharedDefines.h:785
@ SPELL_EFFECT_POWER_DRAIN
Definition: SharedDefines.h:786
@ SPELL_EFFECT_SCHOOL_DAMAGE
Definition: SharedDefines.h:780
@ SPELL_EFFECT_APPLY_AURA
Definition: SharedDefines.h:784
@ SPELL_AURA_PERIODIC_DAMAGE
Definition: SpellAuraDefines.h:66
@ SPELL_AURA_PERIODIC_HEAL
Definition: SpellAuraDefines.h:71
@ SPELL_AURA_PERIODIC_LEECH
Definition: SpellAuraDefines.h:116

References SpellInfo::CalcCastTime(), DOT, SpellInfo::Effects, SpellInfo::GetDuration(), SpellInfo::IsChanneled(), Object::IsCreature(), IsPet(), MAX_SPELL_EFFECTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_LEECH, SPELL_EFFECT_APPLY_AURA, SPELL_EFFECT_ENVIRONMENTAL_DAMAGE, SPELL_EFFECT_HEAL, SPELL_EFFECT_HEALTH_LEECH, SPELL_EFFECT_POWER_BURN, SPELL_EFFECT_POWER_DRAIN, and SPELL_EFFECT_SCHOOL_DAMAGE.

Referenced by CalculateDefaultCoefficient().

◆ GetCharm()

Unit * Unit::GetCharm ( ) const
10672{
10673 if (ObjectGuid charm_guid = GetCharmGUID())
10674 {
10675 if (Unit* pet = ObjectAccessor::GetUnit(*this, charm_guid))
10676 return pet;
10677
10678 LOG_ERROR("entities.unit", "Unit::GetCharm: Charmed creature {} not exist.", charm_guid.ToString());
10680 }
10681
10682 return nullptr;
10683}
@ UNIT_FIELD_CHARM
Definition: UpdateFields.h:86
Unit * GetUnit(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:199
void SetGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:723
ObjectGuid GetCharmGUID() const
Definition: Unit.h:686

References ObjectGuid::Empty, GetCharmGUID(), ObjectAccessor::GetUnit(), LOG_ERROR, Object::SetGuidValue(), and UNIT_FIELD_CHARM.

Referenced by Spell::_cast(), AddPetAura(), spell_hun_check_pet_los::CheckCast(), Spell::CheckCast(), Dismount(), Spell::finish(), GetFirstControlled(), spell_warl_eye_of_kilrogg::HandleAuraApply(), spell_warl_eye_of_kilrogg::HandleAuraRemove(), spell_dk_raise_ally::HandleDummy(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePetSpellAutocastOpcode(), WorldSession::HandleRequestPetInfo(), isPossessing(), Mount(), Player::PossessSpellInitialize(), RemovePetAura(), Spell::SelectImplicitCasterObjectTargets(), SetSpeed(), npc_pilgrims_bounty_chair::SpellHitTarget(), and Player::StopCastingCharm().

◆ GetCharmer()

◆ GetCharmerGUID()

◆ GetCharmerOrOwner()

◆ GetCharmerOrOwnerGUID()

◆ GetCharmerOrOwnerOrOwnGUID()

◆ GetCharmerOrOwnerOrSelf()

Unit * Unit::GetCharmerOrOwnerOrSelf ( ) const
inline
1213 {
1214 if (Unit* u = GetCharmerOrOwner())
1215 return u;
1216
1217 return (Unit*)this;
1218 }

References GetCharmerOrOwner().

Referenced by CombatStart(), CombatStartOnCast(), GetPartyMembers(), GetReactionTo(), IsInPartyWith(), IsInRaidWith(), SetInCombatWith(), and TotemAI::UpdateAI().

◆ GetCharmerOrOwnerPlayerOrPlayerItself()

Player * Unit::GetCharmerOrOwnerPlayerOrPlayerItself ( ) const
10617{
10619 if (guid.IsPlayer())
10620 return ObjectAccessor::GetPlayer(*this, guid);
10621
10622 return const_cast<Unit*>(this)->ToPlayer();
10623}
Player * GetPlayer(Map const *, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:220

References GetCharmerOrOwnerGUID(), ObjectAccessor::GetPlayer(), ObjectGuid::IsPlayer(), and Object::ToPlayer().

Referenced by Spell::_handle_finish_phase(), spell_sha_earthbind_totem::Apply(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), BuildValuesUpdate(), spell_q12237_rescue_villager::CheckCast(), spell_q12237_drop_off_villager::CheckCast(), CombatStart(), CombatStartOnCast(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), DealDamage(), Spell::EffectGameObjectSetDestructionState(), Spell::EffectKillCredit(), Spell::EffectKillCreditPersonal(), Spell::EffectSummonPet(), GetAffectingPlayer(), Object::GetUpdateFieldData(), spell_gen_charmed_unit_spell_cooldown::HandleCast(), spell_q13007_iron_colossus::HandleDummy(), spell_pilgrims_bounty_pass_generic::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_q12851_going_bearback::HandleEffectApply(), spell_q12726_song_of_wind_and_water::HandleHealPct(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_q10769_dissension_amongst_the_ranks::HandleScriptEffect(), npc_pet_gen_valkyr_guardian::InitializeAI(), isTargetableForAttack(), GuardAI::JustDied(), boss_kurinnaxx::JustDied(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustDied(), npc_darnavan::npc_darnavanAI::JustDied(), npc_four_car_garage::npc_four_car_garageAI::JustDied(), npc_scion_of_eternity::npc_scion_of_eternityAI::JustDied(), Kill(), Condition::Meets(), GameObject::ModifyHealth(), npc_amanishi_lookout::MoveInLineOfSight(), npc_eagle_trash_aggro_trigger::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), SmartScript::ProcessAction(), ProcessTerrainStatusUpdate(), Pet::RemoveSpellCooldown(), Spell::SendSpellCooldown(), SetCharm(), SetContestedPvP(), SetInCombatState(), Creature::SetLootRecipient(), npc_deaths_door_fell_cannon_target_bunny::npc_deaths_door_fell_cannon_target_bunnyAI::SpellHit(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_pet_shaman_earth_elemental::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), and Creature::UpdateEntry().

◆ GetCharmGUID()

◆ GetCharmInfo()

◆ getClass()

uint8 Unit::getClass ( ) const
inline
800{ return GetByteValue(UNIT_FIELD_BYTES_0, 1); }
@ UNIT_FIELD_BYTES_0
Definition: UpdateFields.h:95
uint8 GetByteValue(uint16 index, uint8 offset) const
Definition: Object.cpp:323

References Object::GetByteValue(), and UNIT_FIELD_BYTES_0.

Referenced by Player::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), ArenaTeam::AddMember(), SpellEffectInfo::CalcValue(), getClassMask(), GetDebugInfo(), Player::GetDodgeFromAgility(), SocialMgr::GetFriendInfo(), Player::GetMeleeCritFromAgility(), Player::GetMissPercentageFromDefence(), Player::GetPlayerName(), Player::GetRatingMultiplier(), Player::GetSpec(), Player::GetSpellCritFromIntellect(), Player::GetStartPosition(), Player::GiveLevel(), spell_item_flask_of_the_north::HandleDummy(), HandleDummyAuraProc(), learn_commandscript::HandleLearnAllMySpellsCommand(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), HandleProcTriggerSpell(), ArenaSpectator::HandleResetCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), Player::InitDataForForm(), Player::InitDisplayIds(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Player::IsClass(), IsClass(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), Player::LoadFromDB(), AchievementCriteriaData::Meets(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), ClassCallSelector::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), Player::RewardHonor(), Guild::Member::SetStats(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Player::StoreNewItemInBestSlots(), Player::UpdateDodgePercentage(), Player::UpdateParryPercentage(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSkillsForLevel().

◆ getClassMask()

◆ GetCollisionHeight()

float Unit::GetCollisionHeight ( ) const
overridevirtual

Return collision height sent to client.

Reimplemented from WorldObject.

21108{
21109 float scaleMod = GetObjectScale(); // 99% sure about this
21110 float defaultHeight = DEFAULT_COLLISION_HEIGHT * scaleMod;
21111
21112 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
21113 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
21114 float collisionHeight = 0.0f;
21115
21116 if (IsMounted())
21117 {
21119 {
21120 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
21121 {
21122 collisionHeight = scaleMod * (mountModelData->MountHeight + modelData->CollisionHeight * modelData->Scale * displayInfo->scale * 0.5f);
21123 }
21124 }
21125 }
21126 else
21127 collisionHeight = scaleMod * modelData->CollisionHeight * modelData->Scale * displayInfo->scale;
21128
21129 return collisionHeight == 0.0f ? defaultHeight : collisionHeight;
21130}
#define DEFAULT_COLLISION_HEIGHT
Definition: ObjectDefines.h:50
DBCStorage< CreatureDisplayInfoEntry > sCreatureDisplayInfoStore(CreatureDisplayInfofmt)
DBCStorage< CreatureModelDataEntry > sCreatureModelDataStore(CreatureModelDatafmt)
float GetObjectScale() const
Definition: Object.h:115
Definition: DBCStructure.h:720
uint32 ModelId
Definition: DBCStructure.h:722
float scale
Definition: DBCStructure.h:725
Definition: DBCStructure.h:774
float Scale
Definition: DBCStructure.h:778
float CollisionHeight
Definition: DBCStructure.h:789

References CreatureModelDataEntry::CollisionHeight, DEFAULT_COLLISION_HEIGHT, GetNativeDisplayId(), Object::GetObjectScale(), Object::GetUInt32Value(), IsMounted(), CreatureDisplayInfoEntry::ModelId, CreatureDisplayInfoEntry::scale, CreatureModelDataEntry::Scale, sCreatureDisplayInfoStore, sCreatureModelDataStore, and UNIT_FIELD_MOUNTDISPLAYID.

Referenced by DynObjAura::FillTargetMap(), WorldObject::GetNearPoint(), GetRandomContactPoint(), WorldSession::HandleMovementOpcodes(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Spell::SelectImplicitCasterDestTargets(), spell_spawn_blood_pool::SetDest(), WorldObject::UpdateAllowedPositionZ(), and Creature::UpdateMovementFlags().

◆ GetCollisionRadius()

float Unit::GetCollisionRadius ( ) const
overridevirtual

this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC

If the player is mounted the radius also takes in consideration the mount size

Returns
float The radius of a unit

Reimplemented from WorldObject.

21102{
21103 return GetCollisionWidth() / 2;
21104}
float GetCollisionWidth() const override
this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by...
Definition: Unit.cpp:21064

References GetCollisionWidth().

Referenced by GetMeleeAttackPoint(), and Creature::Update().

◆ GetCollisionWidth()

float Unit::GetCollisionWidth ( ) const
overridevirtual

this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC

If the player is mounted the diameter also takes in consideration the mount size

Returns
float The diameter of a unit

Dismounting case - use basic default model data

Reimplemented from WorldObject.

21065{
21066 if (IsPlayer())
21067 return GetObjectSize();
21068
21069 float scaleMod = GetObjectScale(); // 99% sure about this
21070 float objectSize = GetObjectSize();
21071 float defaultSize = DEFAULT_WORLD_OBJECT_SIZE * scaleMod;
21072
21074 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
21075 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
21076
21077 if (IsMounted())
21078 {
21080 {
21081 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
21082 {
21083 if (G3D::fuzzyGt(mountModelData->CollisionWidth, modelData->CollisionWidth))
21084 modelData = mountModelData;
21085 }
21086 }
21087 }
21088
21089 float collisionWidth = scaleMod * modelData->CollisionWidth * modelData->Scale * displayInfo->scale * 2;
21090 // if the objectSize is the default value or the creature is mounted and we have a DBC value, then we can retrieve DBC value instead
21091 return G3D::fuzzyGt(collisionWidth, 0.0f) && (G3D::fuzzyEq(objectSize,defaultSize) || IsMounted()) ? collisionWidth : objectSize;
21092}
#define DEFAULT_WORLD_OBJECT_SIZE
Definition: ObjectDefines.h:45
float GetObjectSize() const
Definition: Object.cpp:2771
float CollisionWidth
Definition: DBCStructure.h:788

References CreatureModelDataEntry::CollisionWidth, DEFAULT_WORLD_OBJECT_SIZE, GetNativeDisplayId(), Object::GetObjectScale(), WorldObject::GetObjectSize(), Object::GetUInt32Value(), IsMounted(), Object::IsPlayer(), CreatureDisplayInfoEntry::ModelId, CreatureDisplayInfoEntry::scale, CreatureModelDataEntry::Scale, sCreatureDisplayInfoStore, sCreatureModelDataStore, and UNIT_FIELD_MOUNTDISPLAYID.

Referenced by GetCollisionRadius().

◆ GetCombatRatingDamageReduction()

uint32 Unit::GetCombatRatingDamageReduction ( CombatRating  cr,
float  rate,
float  cap,
uint32  damage 
) const
private
19196{
19197 float percent = std::min(GetCombatRatingReduction(cr) * rate, cap);
19198 return CalculatePct(damage, percent);
19199}
float GetCombatRatingReduction(CombatRating cr) const
Definition: Unit.cpp:19183

References CalculatePct(), and GetCombatRatingReduction().

Referenced by GetMeleeCritDamageReduction(), GetMeleeDamageReduction(), GetRangedCritDamageReduction(), GetRangedDamageReduction(), GetSpellCritDamageReduction(), and GetSpellDamageReduction().

◆ GetCombatRatingReduction()

float Unit::GetCombatRatingReduction ( CombatRating  cr) const
private
19184{
19185 if (Player const* player = ToPlayer())
19186 return player->GetRatingBonusValue(cr);
19187 // Player's pet get resilience from owner
19188 else if (IsPet() && GetOwner())
19189 if (Player* owner = GetOwner()->ToPlayer())
19190 return owner->GetRatingBonusValue(cr);
19191
19192 return 0.0f;
19193}

References GetOwner(), IsPet(), and Object::ToPlayer().

Referenced by GetCombatRatingDamageReduction(), GetMeleeCritChanceReduction(), GetRangedCritChanceReduction(), and GetSpellCritChanceReduction().

◆ GetCombatReach()

◆ GetCombatTimer()

uint32 Unit::GetCombatTimer ( ) const
inline
894{ return m_CombatTimer; }

References m_CombatTimer.

Referenced by Spell::DoSpellHitOnUnit(), and SetInCombatState().

◆ GetComboPoints() [1/2]

uint8 Unit::GetComboPoints ( ObjectGuid const &  guid) const
inline
959{ return (m_comboTarget && m_comboTarget->GetGUID() == guid) ? m_comboPoints : 0; }

References Object::GetGUID(), m_comboPoints, and m_comboTarget.

◆ GetComboPoints() [2/2]

uint8 Unit::GetComboPoints ( Unit const *  who = nullptr) const
inline

◆ GetComboTarget()

Unit * Unit::GetComboTarget ( ) const
inline
960{ return m_comboTarget; }

References m_comboTarget.

Referenced by Player::DuelComplete(), and HandleProcTriggerSpell().

◆ GetComboTargetGUID()

ObjectGuid const Unit::GetComboTargetGUID ( ) const
inline

◆ GetCompanionPet()

Creature * Unit::GetCompanionPet ( ) const
10667{
10669}
#define SUMMON_SLOT_MINIPET
Definition: Unit.h:599
Creature * GetCreature(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:210

References ObjectAccessor::GetCreature(), m_SummonSlot, and SUMMON_SLOT_MINIPET.

Referenced by HandleProcTriggerSpell().

◆ GetCreateHealth()

◆ GetCreateMana()

◆ GetCreatePowers()

uint32 Unit::GetCreatePowers ( Powers  power) const
15661{
15662 // Only hunter pets have POWER_FOCUS and POWER_HAPPINESS
15663 switch (power)
15664 {
15665 case POWER_MANA:
15666 return GetCreateMana();
15667 case POWER_RAGE:
15668 return 1000;
15669 case POWER_FOCUS:
15670 return (IsPlayer() || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 100);
15671 case POWER_ENERGY:
15672 return 100;
15673 case POWER_HAPPINESS:
15674 return (IsPlayer() || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 1050000);
15675 case POWER_RUNIC_POWER:
15676 return 1000;
15677 case POWER_RUNE:
15678 return 0;
15679 case POWER_HEALTH:
15680 return 0;
15681 default:
15682 break;
15683 }
15684
15685 return 0;
15686}
@ POWER_HEALTH
Definition: SharedDefines.h:278
@ POWER_RUNIC_POWER
Definition: SharedDefines.h:275
@ POWER_ENERGY
Definition: SharedDefines.h:272
@ POWER_RUNE
Definition: SharedDefines.h:274
@ POWER_FOCUS
Definition: SharedDefines.h:271
uint32 GetCreateMana() const
Definition: Unit.h:1070

References GetCreateMana(), HUNTER_PET, IsPet(), Object::IsPlayer(), POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_HEALTH, POWER_MANA, POWER_RAGE, POWER_RUNE, and POWER_RUNIC_POWER.

Referenced by Pet::CreateBaseAtTamed(), HandleDummyAuraProc(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), setPowerType(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ GetCreateStat()

float Unit::GetCreateStat ( Stats  stat) const
inline

◆ GetCreatorGUID()

ObjectGuid Unit::GetCreatorGUID ( ) const
inline
@ UNIT_FIELD_CREATEDBY
Definition: UpdateFields.h:91

References Object::GetGuidValue(), and UNIT_FIELD_CREATEDBY.

Referenced by Condition::Meets().

◆ GetCreatureType()

uint32 Unit::GetCreatureType ( ) const
15183{
15184 if (IsPlayer())
15185 {
15187 SpellShapeshiftFormEntry const* ssEntry = sSpellShapeshiftFormStore.LookupEntry(form);
15188 if (ssEntry && ssEntry->creatureType > 0)
15189 return ssEntry->creatureType;
15190 else
15192 }
15193 else
15194 return ToCreature()->GetCreatureTemplate()->type;
15195}
@ CREATURE_TYPE_HUMANOID
Definition: SharedDefines.h:2634
ShapeshiftForm
Definition: UnitDefines.h:68
DBCStorage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore(SpellShapeshiftFormEntryfmt)
uint32 type
Definition: CreatureData.h:222
ShapeshiftForm GetShapeshiftForm() const
Definition: Unit.h:1817
Definition: DBCStructure.h:1816
int32 creatureType
Definition: DBCStructure.h:1822

References CREATURE_TYPE_HUMANOID, SpellShapeshiftFormEntry::creatureType, Creature::GetCreatureTemplate(), GetShapeshiftForm(), Object::IsPlayer(), sSpellShapeshiftFormStore, Object::ToCreature(), and CreatureTemplate::type.

Referenced by Creature::CanStartAttack(), spell_utgarde_pinnacle_beast_mark::CheckProc(), Spell::EffectKnockBack(), spell_dk_death_pact::FilterTargets(), GetCreatureTypeMask(), GetUnitParryChance(), AuraEffect::HandleAuraEmpathy(), spell_dru_starfall_dummy::HandleDummy(), IsCritter(), CreatureAI::MoveInLineOfSight(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnUnitDeath(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), SetInCombatState(), and Creature::UpdateMoveInLineOfSightState().

◆ GetCreatureTypeMask()

uint32 Unit::GetCreatureTypeMask ( ) const
inline
786 {
787 uint32 creatureType = GetCreatureType();
788 return (creatureType >= 1) ? (1 << (creatureType - 1)) : 0;
789 }
uint32 GetCreatureType() const
Definition: Unit.cpp:15182

References GetCreatureType().

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), SpellInfo::CheckTargetCreatureType(), MeleeDamageBonusDone(), SpellCriticalDamageBonus(), SpellCriticalHealingBonus(), SpellDamageBonusDone(), SpellPctDamageModsDone(), and SpellTakenCritChance().

◆ GetCritterGUID()

ObjectGuid Unit::GetCritterGUID ( ) const
inline

◆ GetCurrentSpell() [1/2]

◆ GetCurrentSpell() [2/2]

Spell * Unit::GetCurrentSpell ( uint32  spellType) const
inline
1450{ return m_currentSpells[spellType]; }

References m_currentSpells.

◆ GetCurrentSpellCastTime()

int32 Unit::GetCurrentSpellCastTime ( uint32  spell_id) const
4153{
4154 if (Spell const* spell = FindCurrentSpellBySpellId(spell_id))
4155 return spell->GetCastTime();
4156 return 0;
4157}
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition: Unit.cpp:4144

References FindCurrentSpellBySpellId().

Referenced by CasterAI::JustEngagedWith(), CasterAI::UpdateAI(), and boss_mandokir::boss_mandokirAI::UpdateAI().

◆ getDeathState()

◆ GetDebugInfo()

std::string Unit::GetDebugInfo ( ) const
overridevirtual

Reimplemented from WorldObject.

21332{
21333 std::stringstream sstr;
21334 sstr << WorldObject::GetDebugInfo() << "\n"
21335 << std::boolalpha
21336 << "AliveState: " << IsAlive()
21337 << " UnitMovementFlags: " << GetUnitMovementFlags() << " ExtraUnitMovementFlags: " << GetExtraUnitMovementFlags()
21338 << " Class: " << std::to_string(getClass());
21339 return sstr.str();
21340}
std::string GetDebugInfo() const override
Definition: Object.cpp:2484

References getClass(), WorldObject::GetDebugInfo(), GetExtraUnitMovementFlags(), GetUnitMovementFlags(), and IsAlive().

Referenced by UnitAI::GetDebugInfo(), Creature::GetDebugInfo(), and Player::GetDebugInfo().

◆ GetDefaultMovementType()

MovementGeneratorType Unit::GetDefaultMovementType ( ) const
virtual

-------—End of Pet responses methods-------—

Reimplemented in Creature.

16647{
16648 return IDLE_MOTION_TYPE;
16649}
@ IDLE_MOTION_TYPE
Definition: MotionMaster.h:39

References IDLE_MOTION_TYPE.

◆ GetDefenseSkillValue()

uint32 Unit::GetDefenseSkillValue ( Unit const *  target = nullptr) const
3626{
3627 if (IsPlayer())
3628 {
3629 // in PvP use full skill instead current skill value
3630 uint32 value = (target && target->IsPlayer())
3633 value += uint32(ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL));
3634 return value;
3635 }
3636 else
3637 return GetUnitMeleeSkill(target);
3638}
@ SKILL_DEFENSE
Definition: SharedDefines.h:2881
@ CR_DEFENSE_SKILL
Definition: Unit.h:218
uint16 GetSkillValue(uint32 skill) const
Definition: Player.cpp:5446
uint16 GetMaxSkillValue(uint32 skill) const
Definition: Player.cpp:5463

References CR_DEFENSE_SKILL, Player::GetMaxSkillValue(), Player::GetSkillValue(), GetUnitMeleeSkill(), Object::IsPlayer(), SKILL_DEFENSE, and Object::ToPlayer().

Referenced by spell_pal_ardent_defender::Absorb(), DealMeleeDamage(), GetUnitCriticalChance(), RollMeleeOutcomeAgainst(), SpellTakenCritChance(), Player::UpdateBlockPercentage(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetDiminishing()

DiminishingLevels Unit::GetDiminishing ( DiminishingGroup  group)
15008{
15009 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15010 {
15011 if (i->DRGroup != group)
15012 continue;
15013
15014 if (!i->hitCount)
15015 return DIMINISHING_LEVEL_1;
15016
15017 if (!i->hitTime)
15018 return DIMINISHING_LEVEL_1;
15019
15020 // If last spell was casted more than 15 seconds ago - reset the count.
15021 if (i->stack == 0 && getMSTimeDiff(i->hitTime, GameTime::GetGameTimeMS().count()) > 15000)
15022 {
15023 i->hitCount = DIMINISHING_LEVEL_1;
15024 return DIMINISHING_LEVEL_1;
15025 }
15026 // or else increase the count.
15027 else
15028 return DiminishingLevels(i->hitCount);
15029 }
15030 return DIMINISHING_LEVEL_1;
15031}
uint32 getMSTimeDiff(uint32 oldMSTime, uint32 newMSTime)
Definition: Timer.h:110

References DIMINISHING_LEVEL_1, GameTime::GetGameTimeMS(), getMSTimeDiff(), and m_Diminishing.

Referenced by Spell::DoSpellHitOnUnit().

◆ GetDirectTransport()

TransportBase * Unit::GetDirectTransport ( ) const

◆ GetDiseasesByCaster()

uint32 Unit::GetDiseasesByCaster ( ObjectGuid  casterGUID,
uint8  mode = 0 
)
5822{
5823 static const AuraType diseaseAuraTypes[] =
5824 {
5825 SPELL_AURA_PERIODIC_DAMAGE, // Frost Fever and Blood Plague
5826 SPELL_AURA_LINKED, // Crypt Fever and Ebon Plague
5828 };
5829
5830 ObjectGuid drwGUID;
5831
5832 if (Player* playerCaster = ObjectAccessor::GetPlayer(*this, casterGUID))
5833 drwGUID = playerCaster->getRuneWeaponGUID();
5834
5835 uint32 diseases = 0;
5836 for (uint8 index = 0; diseaseAuraTypes[index] != SPELL_AURA_NONE; ++index)
5837 {
5838 for (AuraEffectList::iterator i = m_modAuras[diseaseAuraTypes[index]].begin(); i != m_modAuras[diseaseAuraTypes[index]].end();)
5839 {
5840 // Get auras with disease dispel type by caster
5841 if ((*i)->GetSpellInfo()->Dispel == DISPEL_DISEASE
5842 && ((*i)->GetCasterGUID() == casterGUID || (*i)->GetCasterGUID() == drwGUID)) // if its caster or his dancing rune weapon
5843 {
5844 ++diseases;
5845
5846 if (mode == 1)
5847 {
5848 RemoveAura((*i)->GetId(), (*i)->GetCasterGUID());
5849 i = m_modAuras[diseaseAuraTypes[index]].begin();
5850 continue;
5851 }
5852 // used for glyph of scourge strike
5853 else if (mode == 2)
5854 {
5855 Aura* aura = (*i)->GetBase();
5856 if (aura && !aura->IsRemoved() && aura->GetDuration() > 0)
5857 if ((aura->GetApplyTime() + aura->GetMaxDuration() / 1000 + 8) > (GameTime::GetGameTime().count() + aura->GetDuration() / 1000))
5858 aura->SetDuration(aura->GetDuration() + 3000);
5859 }
5860 }
5861 ++i;
5862 }
5863 }
5864 return diseases;
5865}
@ DISPEL_DISEASE
Definition: SharedDefines.h:1375
AuraType
Definition: SpellAuraDefines.h:62
@ SPELL_AURA_LINKED
Definition: SpellAuraDefines.h:347
@ SPELL_AURA_NONE
Definition: SpellAuraDefines.h:63
int32 GetMaxDuration() const
Definition: SpellAuras.h:129
time_t GetApplyTime() const
Definition: SpellAuras.h:128

References DISPEL_DISEASE, Aura::GetApplyTime(), Aura::GetDuration(), GameTime::GetGameTime(), Aura::GetMaxDuration(), ObjectAccessor::GetPlayer(), Aura::IsRemoved(), m_modAuras, RemoveAura(), Aura::SetDuration(), SPELL_AURA_LINKED, SPELL_AURA_NONE, and SPELL_AURA_PERIODIC_DAMAGE.

Referenced by Spell::EffectWeaponDmg(), MeleeDamageBonusDone(), and SpellPctDamageModsDone().

◆ GetDispellableAuraList()

void Unit::GetDispellableAuraList ( Unit caster,
uint32  dispelMask,
DispelChargesList dispelList,
SpellInfo const *  dispelSpell 
)
5606{
5607 // we should not be able to dispel diseases if the target is affected by unholy blight
5608 if (dispelMask & (1 << DISPEL_DISEASE) && HasAura(50536))
5609 dispelMask &= ~(1 << DISPEL_DISEASE);
5610
5611 ReputationRank rank = GetReactionTo(caster, IsCharmed());
5612 bool positive = rank >= REP_FRIENDLY;
5613
5614 // Neutral unit not at war with caster should be treated as a friendly unit
5615 if (rank == REP_NEUTRAL)
5616 {
5617 if (Player* casterPlayer = caster->GetAffectingPlayer())
5618 {
5619 if (FactionTemplateEntry const* factionTemplateEntry = GetFactionTemplateEntry())
5620 {
5621 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
5622 {
5623 if (factionEntry->CanBeSetAtWar())
5624 {
5625 positive = !casterPlayer->GetReputationMgr().IsAtWar(factionEntry);
5626 }
5627 }
5628 }
5629 }
5630 }
5631
5632 Unit::VisibleAuraMap const* visibleAuras = GetVisibleAuras();
5633 for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
5634 {
5635 Aura* aura = itr->second->GetBase();
5636
5637 // don't try to remove passive auras
5638 if (aura->IsPassive())
5639 continue;
5640
5641 if (aura->GetSpellInfo()->GetDispelMask() & dispelMask)
5642 {
5643 if (aura->GetSpellInfo()->Dispel == DISPEL_MAGIC)
5644 {
5645 // do not remove positive auras if friendly target
5646 // negative auras if non-friendly target
5647 if (itr->second->IsPositive() == positive)
5648 continue;
5649 }
5650
5651 // Banish should only be dispelled by Mass Dispel
5652 if (aura->GetSpellInfo()->Mechanic == MECHANIC_BANISH && !dispelSpell->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
5653 {
5654 continue;
5655 }
5656
5657 // The charges / stack amounts don't count towards the total number of auras that can be dispelled.
5658 // Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell
5659 // Polymorph instead of 1 / (5 + 1) -> 16%.
5660 bool dispel_charges = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_REMOVES_CHARGES);
5661 uint8 charges = dispel_charges ? aura->GetCharges() : aura->GetStackAmount();
5662 if (charges > 0)
5663 dispelList.push_back(std::make_pair(aura, charges));
5664 }
5665 }
5666}
@ SPELL_ATTR7_DISPEL_REMOVES_CHARGES
Definition: SharedDefines.h:651
@ MECHANIC_BANISH
Definition: SharedDefines.h:1343
@ SPELL_ATTR0_NO_IMMUNITIES
Definition: SharedDefines.h:411
@ REP_FRIENDLY
Definition: SharedDefines.h:184
@ DISPEL_MAGIC
Definition: SharedDefines.h:1373
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition: Unit.cpp:5698
std::map< uint8, AuraApplication * > VisibleAuraMap
Definition: Unit.h:652
VisibleAuraMap const * GetVisibleAuras()
Definition: Unit.h:1412
uint8 GetStackAmount() const
Definition: SpellAuras.h:148
uint8 GetCharges() const
Definition: SpellAuras.h:141
bool IsPassive() const
Definition: SpellAuras.cpp:1082
uint32 Mechanic
Definition: SpellInfo.h:323
uint32 Dispel
Definition: SpellInfo.h:322

References SpellInfo::Dispel, DISPEL_DISEASE, DISPEL_MAGIC, GetAffectingPlayer(), Aura::GetCharges(), SpellInfo::GetDispelMask(), GetFactionTemplateEntry(), GetReactionTo(), Aura::GetSpellInfo(), Aura::GetStackAmount(), GetVisibleAuras(), SpellInfo::HasAttribute(), HasAura(), IsCharmed(), Aura::IsPassive(), SpellInfo::Mechanic, MECHANIC_BANISH, REP_FRIENDLY, REP_NEUTRAL, sFactionStore, SPELL_ATTR0_NO_IMMUNITIES, and SPELL_ATTR7_DISPEL_REMOVES_CHARGES.

Referenced by Spell::EffectDispel().

◆ GetDisplayId()

◆ GetDisplayRace()

DisplayRace Unit::GetDisplayRace ( ) const
inline
DisplayRace GetDisplayRaceFromModelId(uint32 modelId) const
Definition: Unit.cpp:21026
uint32 GetDisplayId() const
Definition: Unit.h:1837

References GetDisplayId(), and GetDisplayRaceFromModelId().

Referenced by AuraEffect::HandleAuraTransform().

◆ GetDisplayRaceFromModelId()

DisplayRace Unit::GetDisplayRaceFromModelId ( uint32  modelId) const
21027{
21028 if (CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(modelId))
21029 {
21030 if (CreatureDisplayInfoExtraEntry const* displayExtra = sCreatureDisplayInfoExtraStore.LookupEntry(display->ExtendedDisplayInfoID))
21031 {
21032 return DisplayRace(displayExtra->DisplayRaceID);
21033 }
21034 }
21035 return DisplayRace::None;
21036}
DisplayRace
Definition: SharedDefines.h:111
DBCStorage< CreatureDisplayInfoExtraEntry > sCreatureDisplayInfoExtraStore(CreatureDisplayInfoExtrafmt)
Definition: DBCStructure.h:738

References sCreatureDisplayInfoExtraStore, and sCreatureDisplayInfoStore.

Referenced by GetDisplayRace().

◆ GetDoTsByCaster()

uint32 Unit::GetDoTsByCaster ( ObjectGuid  casterGUID) const
5868{
5869 static const AuraType diseaseAuraTypes[] =
5870 {
5874 };
5875
5876 uint32 dots = 0;
5877 for (AuraType const* itr = &diseaseAuraTypes[0]; itr && itr[0] != SPELL_AURA_NONE; ++itr)
5878 {
5879 Unit::AuraEffectList const& auras = GetAuraEffectsByType(*itr);
5880 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5881 {
5882 // Get auras by caster
5883 if ((*i)->GetCasterGUID() == casterGUID)
5884 ++dots;
5885 }
5886 }
5887 return dots;
5888}
@ SPELL_AURA_PERIODIC_DAMAGE_PERCENT
Definition: SpellAuraDefines.h:152

References GetAuraEffectsByType(), SPELL_AURA_NONE, SPELL_AURA_PERIODIC_DAMAGE, and SPELL_AURA_PERIODIC_DAMAGE_PERCENT.

Referenced by SpellPctDamageModsDone().

◆ GetDummyAuraEffect()

◆ GetDynamicFlags()

◆ GetDynObject()

DynamicObject * Unit::GetDynObject ( uint32  spellId)
6129{
6130 if (m_dynObj.empty())
6131 return nullptr;
6132 for (DynObjectList::const_iterator i = m_dynObj.begin(); i != m_dynObj.end(); ++i)
6133 {
6134 DynamicObject* dynObj = *i;
6135 if (dynObj->GetSpellId() == spellId)
6136 return dynObj;
6137 }
6138 return nullptr;
6139}
Definition: DynamicObject.h:35
uint32 GetSpellId() const
Definition: DynamicObject.h:58

References DynamicObject::GetSpellId(), and m_dynObj.

Referenced by Spell::DelayedChannel(), and WorldSession::HandleFarSightOpcode().

◆ GetEffectiveResistChance()

float Unit::GetEffectiveResistChance ( Unit const *  owner,
SpellSchoolMask  schoolMask,
Unit const *  victim 
)
static
2114{
2115 float victimResistance = float(victim->GetResistance(schoolMask));
2116 if (owner)
2117 {
2118 // Xinef: pets inherit 100% of masters penetration
2119 // Xinef: excluding traps
2120 Player const* player = owner->GetSpellModOwner();
2121 if (player && owner->GetEntry() != WORLD_TRIGGER)
2122 {
2123 victimResistance += float(player->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2124 victimResistance -= float(player->GetSpellPenetrationItemMod());
2125 }
2126 else
2127 victimResistance += float(owner->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2128 }
2129
2130 victimResistance = std::max(victimResistance, 0.0f);
2131 if (owner)
2132 victimResistance += std::max((float(victim->GetLevel()) - float(owner->GetLevel())) * 5.0f, 0.0f);
2133
2134 static uint32 const BOSS_LEVEL = 83;
2135 static float const BOSS_RESISTANCE_CONSTANT = 510.0f;
2136 uint32 level = victim->GetLevel();
2137 float resistanceConstant = 0.0f;
2138
2139 if (level == BOSS_LEVEL)
2140 resistanceConstant = BOSS_RESISTANCE_CONSTANT;
2141 else
2142 resistanceConstant = level * 5.0f;
2143
2144 return victimResistance / (victimResistance + resistanceConstant);
2145}
int32 GetSpellPenetrationItemMod() const
Definition: Player.h:1955

References Object::GetEntry(), GetLevel(), GetResistance(), GetSpellModOwner(), Player::GetSpellPenetrationItemMod(), GetTotalAuraModifierByMiscMask(), SPELL_AURA_MOD_TARGET_RESISTANCE, and WORLD_TRIGGER.

Referenced by CalcAbsorbResist(), and MagicSpellHitResult().

◆ GetExtraUnitMovementFlags()

uint16 Unit::GetExtraUnitMovementFlags ( ) const
inline

◆ GetFaction()

uint32 Unit::GetFaction ( ) const
inline

References Object::GetUInt32Value(), and UNIT_FIELD_FACTIONTEMPLATE.

Referenced by npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::AttackStart(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::AttackStart(), Creature::CanAssistTo(), spell_q10985_light_of_the_naaru::CheckProc(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), Spell::EffectDuel(), Spell::EffectSummonType(), npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::EnterEvadeMode(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::EnterEvadeMode(), AuctionListItemsDelayEvent::Execute(), npc_chesspiece::GetDefaultOrientationForTeam(), GetFactionTemplateEntry(), GetReactionTo(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListOwnerItemsEvent(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleGossipHelloOpcode(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcGuidCommand(), npc_commandscript::HandleNpcInfoCommand(), npc_echo_of_medivh::HandlePieceJustDied(), WorldSession::HandlePlayerLoginFromDB(), TempSummon::InitStats(), InitTamedPet(), IsFriendly(), IsInPartyWith(), IsInRaidWith(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), npc_escortAI::JustRespawned(), FollowerAI::JustRespawned(), SmartAI::JustRespawned(), boss_volkhan::boss_volkhanAI::JustSummoned(), Pet::LoadPetFromDB(), npc_chesspiece::npc_chesspiece(), npc_plucky::npc_pluckyAI::npc_pluckyAI(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::npc_taskmaster_fizzuleAI(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::OnPlayerEnter(), npc_eris_hevenfire::OnQuestAccept(), npc_cork_gizelton::OnQuestAccept(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), PatchValuesUpdate(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::Reset(), WorldSession::SendAuctionHello(), SetCharmedBy(), Player::SetGameMaster(), npc_chesspiece::sGossipHello(), boss_malchezaar::SpawnInfernal(), Spell::SummonGuardian(), Player::SummonPet(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), npc_chesspiece::UpdateAI(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), and Creature::UpdateMoveInLineOfSightState().

◆ GetFactionReactionTo()

ReputationRank Unit::GetFactionReactionTo ( FactionTemplateEntry const *  factionTemplateEntry,
Unit const *  target 
) const
10185{
10186 // always neutral when no template entry found
10187 if (!factionTemplateEntry)
10188 return REP_NEUTRAL;
10189
10190 FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry();
10191 if (!targetFactionTemplateEntry)
10192 return REP_NEUTRAL;
10193
10194 // xinef: check forced reputation for self also
10195 if (Player const* selfPlayerOwner = GetAffectingPlayer())
10196 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(target->GetFactionTemplateEntry()))
10197 return *repRank;
10198
10199 if (Player const* targetPlayerOwner = target->GetAffectingPlayer())
10200 {
10201 // check contested flags
10202 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10203 && targetPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10204 return REP_HOSTILE;
10205 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(factionTemplateEntry))
10206 return *repRank;
10207 if (!target->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10208 {
10209 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
10210 {
10211 if (factionEntry->CanHaveReputation())
10212 {
10213 // CvP case - check reputation, don't allow state higher than neutral when at war
10214 ReputationRank repRank = targetPlayerOwner->GetReputationMgr().GetRank(factionEntry);
10215 if (targetPlayerOwner->GetReputationMgr().IsAtWar(factionEntry))
10216 repRank = std::min(REP_NEUTRAL, repRank);
10217 return repRank;
10218 }
10219 }
10220 }
10221 }
10222
10223 // common faction based check
10224 if (factionTemplateEntry->IsHostileTo(*targetFactionTemplateEntry))
10225 return REP_HOSTILE;
10226 if (factionTemplateEntry->IsFriendlyTo(*targetFactionTemplateEntry))
10227 return REP_FRIENDLY;
10228 if (targetFactionTemplateEntry->IsFriendlyTo(*factionTemplateEntry))
10229 return REP_FRIENDLY;
10230 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS)
10231 return REP_HOSTILE;
10232 // neutral by default
10233 return REP_NEUTRAL;
10234}
@ FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS
Definition: DBCEnums.h:332
@ FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
Definition: DBCEnums.h:331
@ PLAYER_FLAGS_CONTESTED_PVP
Definition: Player.h:482
@ UNIT_FLAG2_IGNORE_REPUTATION
Definition: UnitDefines.h:270
bool IsFriendlyTo(FactionTemplateEntry const &entry) const
Definition: DBCStructure.h:950

References FactionTemplateEntry::faction, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS, FactionTemplateEntry::factionFlags, GetAffectingPlayer(), GetFactionTemplateEntry(), HasUnitFlag2(), FactionTemplateEntry::IsFriendlyTo(), FactionTemplateEntry::IsHostileTo(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HOSTILE, REP_NEUTRAL, sFactionStore, and UNIT_FLAG2_IGNORE_REPUTATION.

Referenced by GetReactionTo().

◆ GetFactionTemplateEntry()

FactionTemplateEntry const * Unit::GetFactionTemplateEntry ( ) const
10035{
10036 FactionTemplateEntry const* entry = sFactionTemplateStore.LookupEntry(GetFaction());
10037 if (!entry)
10038 {
10039 static ObjectGuid guid; // prevent repeating spam same faction problem
10040
10041 if (GetGUID() != guid)
10042 {
10043 if (Player const* player = ToPlayer())
10044 LOG_ERROR("entities.unit", "Player {} has invalid faction (faction template id) #{}", player->GetName(), GetFaction());
10045 else if (Creature const* creature = ToCreature())
10046 LOG_ERROR("entities.unit", "Creature (template id: {}) has invalid faction (faction template id) #{}", creature->GetCreatureTemplate()->Entry, GetFaction());
10047 else
10048 LOG_ERROR("entities.unit", "Unit (name={}, type={}) has invalid faction (faction template id) #{}", GetName(), uint32(GetTypeId()), GetFaction());
10049
10050 guid = GetGUID();
10051 }
10052 }
10053 return entry;
10054}
DBCStorage< FactionTemplateEntry > sFactionTemplateStore(FactionTemplateEntryfmt)
TypeID GetTypeId() const
Definition: Object.h:124
std::string const & GetName() const
Definition: Object.h:458
uint32 GetFaction() const
Definition: Unit.h:808

References GetFaction(), Object::GetGUID(), WorldObject::GetName(), Object::GetTypeId(), LOG_ERROR, sFactionTemplateStore, Object::ToCreature(), and Object::ToPlayer().

Referenced by _IsValidAttackTarget(), Player::CanUseBattlegroundObject(), HostileRefMgr::deleteReferencesForFaction(), Spell::EffectGameObjectDamage(), GetDispellableAuraList(), GetFactionReactionTo(), GetReactionTo(), Player::GetReputationPriceDiscount(), IsContestedGuard(), IsHostileToPlayers(), IsNeutralToAll(), npc_chesspiece::OnCharmed(), and PatchValuesUpdate().

◆ GetFirstControlled()

Unit * Unit::GetFirstControlled ( ) const
11076{
11077 // Sequence: charmed, pet, other guardians
11078 Unit* unit = GetCharm();
11079 if (!unit)
11080 if (ObjectGuid guid = GetMinionGUID())
11081 unit = ObjectAccessor::GetUnit(*this, guid);
11082
11083 return unit;
11084}
ObjectGuid GetMinionGUID() const
Definition: Unit.h:682

References GetCharm(), GetMinionGUID(), and ObjectAccessor::GetUnit().

Referenced by Player::CharmSpellInitialize(), CombatStart(), WorldSession::HandlePetSetAction(), and RemoveCharmedBy().

◆ GetFirstMinion()

Minion * Unit::GetFirstMinion ( ) const
10637{
10638 if (ObjectGuid pet_guid = GetMinionGUID())
10639 {
10640 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10641 if (pet->HasUnitTypeMask(UNIT_MASK_MINION))
10642 return (Minion*)pet;
10643
10644 LOG_ERROR("entities.unit", "Unit::GetFirstMinion: Minion {} not exist.", pet_guid.ToString());
10645 const_cast<Unit*>(this)->SetMinionGUID(ObjectGuid::Empty);
10646 }
10647
10648 return nullptr;
10649}
Creature * GetCreatureOrPetOrVehicle(WorldObject const &, ObjectGuid const)
Definition: ObjectAccessor.cpp:234
void SetMinionGUID(ObjectGuid guid)
Definition: Unit.h:683

References ObjectGuid::Empty, ObjectAccessor::GetCreatureOrPetOrVehicle(), GetMinionGUID(), LOG_ERROR, SetMinionGUID(), and UNIT_MASK_MINION.

◆ GetFollowAngle()

◆ GetGameObject()

GameObject * Unit::GetGameObject ( uint32  spellId) const
6170{
6171 for (GameObjectList::const_iterator itr = m_gameObj.begin(); itr != m_gameObj.end(); ++itr)
6172 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6173 if (go->GetSpellId() == spellId)
6174 return go;
6175
6176 return nullptr;
6177}

References ObjectAccessor::GetGameObject(), and m_gameObj.

Referenced by Player::GetGameObjectIfCanInteractWith(), and Player::TeleportTo().

◆ getGender()

◆ GetGuardianPet()

Guardian * Unit::GetGuardianPet ( ) const
10652{
10653 if (ObjectGuid pet_guid = GetPetGUID())
10654 {
10655 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10656 if (pet->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
10657 return (Guardian*)pet;
10658
10659 LOG_FATAL("entities.unit", "Unit::GetGuardianPet: Guardian {} not exist.", pet_guid.ToString());
10660 const_cast<Unit*>(this)->SetPetGUID(ObjectGuid::Empty);
10661 }
10662
10663 return nullptr;
10664}
#define LOG_FATAL(filterType__,...)
Definition: Log.h:153
Definition: TemporarySummon.h:95
void SetPetGUID(ObjectGuid guid)
Definition: Unit.h:687
ObjectGuid GetPetGUID() const
Definition: Unit.h:688

References ObjectGuid::Empty, ObjectAccessor::GetCreatureOrPetOrVehicle(), GetPetGUID(), LOG_FATAL, SetPetGUID(), and UNIT_MASK_GUARDIAN.

Referenced by spell_hun_check_pet_los::CheckCast(), Spell::CheckCast(), Spell::EffectSummonPet(), GetNextRandomRaidMemberOrPet(), AuraEffect::HandleAuraDummy(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), AuraEffect::HandleModDamageDone(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePetSpellAutocastOpcode(), Spell::SelectImplicitCasterObjectTargets(), and SetMinion().

◆ GetHealth()

uint32 Unit::GetHealth ( ) const
inline
@ UNIT_FIELD_HEALTH
Definition: UpdateFields.h:96

References Object::GetUInt32Value(), and UNIT_FIELD_HEALTH.

Referenced by Player::_SaveCharacter(), spell_yogg_saron_protective_gaze_aura::Absorb(), spell_pri_guardian_spirit::Absorb(), spell_rog_cheat_death::Absorb(), spell_pal_ardent_defender::Absorb(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), Spell::CheckPower(), CountPctFromCurHealth(), ScriptedAI::DamageTaken(), boss_eregos::boss_eregosAI::DamageTaken(), boss_razorgore::boss_razorgoreAI::DamageTaken(), boss_majordomo::boss_majordomoAI::DamageTaken(), boss_ragnaros::boss_ragnarosAI::DamageTaken(), npc_mc_core_hound::npc_mc_core_houndAI::DamageTaken(), boss_attumen::DamageTaken(), boss_midnight::DamageTaken(), boss_julianne::DamageTaken(), boss_romulo::DamageTaken(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_muru::DamageTaken(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::DamageTaken(), boss_headless_horseman::DamageTaken(), boss_headless_horseman_head::DamageTaken(), npc_amanitar_mushrooms::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), npc_argent_soldier::npc_argent_soldierAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_announcer_toc5::npc_announcer_toc5AI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_ick::boss_ickAI::DamageTaken(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::DamageTaken(), boss_drakkari_colossus::boss_drakkari_colossusAI::DamageTaken(), npc_gunship::npc_gunshipAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), npc_collapsing_star::npc_collapsing_starAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_akama_illidan::DamageTaken(), npc_maiev_illidan::DamageTaken(), boss_illidari_council::DamageTaken(), boss_illidari_council_memberAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_akama_shade::DamageTaken(), boss_the_lurker_below::DamageTaken(), npc_shattered_hand_scout::DamageTaken(), boss_alar::DamageTaken(), advisor_baseAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_hor_leader_second::npc_hor_leader_secondAI::DamageTaken(), npc_ice_tomb::npc_ice_tombAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_nightbane::DamageTaken(), boss_thekal::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), boss_illidan_stormrage::DamageTaken(), npc_garr_firesworn::npc_garr_fireswornAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), SmartAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_kologarn::boss_kologarnAI::DamageTaken(), boss_kologarn_arms::boss_kologarn_armsAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), DealDamage(), DealMeleeDamage(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::DoDie(), Spell::EffectHealMaxHealth(), Spell::EffectInstaKill(), Pet::FillPetInfo(), boss_supremus::FindHatefulStrikeTarget(), GetHealthGain(), GetHealthPct(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_rajaxx_thundercrash::HandleDamageCalc(), misc_commandscript::HandleDieCommand(), spell_oculus_soar_aura::HandleEffectPeriodic(), Player::HandleFall(), npc_commandscript::HandleNpcInfoCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blood_draining_enchant::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), IsFullHealth(), npc_dirt_mound::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), Kill(), ModifyHealth(), spell_xt002_gravity_bomb_aura::OnPeriodic(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::operator()(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), Creature::ResetPlayerDamageReq(), Player::SaveHealthBeforeDuel(), Pet::SavePetToDB(), Creature::SaveToDB(), SendAttackStateUpdate(), SendSpellNonMeleeDamageLog(), SendSpellNonMeleeReflectLog(), SetMaxHealth(), boss_eadric::boss_eadricAI::SpellHit(), boss_headless_horseman_head::SpellHitTarget(), boss_malchezaar::SpellHitTarget(), boss_ouro::Submerge(), Aura::Update(), boss_headless_horseman::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), Player::UpdateCharmedAI(), Creature::UpdateEntry(), and boss_twin_valkyrAI::UpdateSharedHealth().

◆ GetHealthGain()

int32 Unit::GetHealthGain ( int32  dVal)
14124{
14125 int32 gain = 0;
14126
14127 if (dVal == 0)
14128 return 0;
14129
14130 int32 curHealth = (int32)GetHealth();
14131
14132 int32 val = dVal + curHealth;
14133 if (val <= 0)
14134 {
14135 return -curHealth;
14136 }
14137
14138 int32 maxHealth = (int32)GetMaxHealth();
14139
14140 if (val < maxHealth)
14141 gain = dVal;
14142 else if (curHealth != maxHealth)
14143 gain = maxHealth - curHealth;
14144
14145 return gain;
14146}

References GetHealth(), and GetMaxHealth().

Referenced by Spell::DoAllEffectOnTarget().

◆ GetHealthPct()

◆ getHostileRefMgr()

◆ GetHoverHeight()

float Unit::GetHoverHeight ( ) const
inline

◆ GetInterruptMask()

uint32 Unit::GetInterruptMask ( ) const
inline
1475{ return m_interruptMask; }

References m_interruptMask.

◆ GetLastDamagedTargetGuid()

ObjectGuid const & Unit::GetLastDamagedTargetGuid ( ) const
inline
917{ return _lastDamagedTargetGuid; }

References _lastDamagedTargetGuid.

◆ GetLastExtraAttackSpell()

uint32 Unit::GetLastExtraAttackSpell ( ) const
inline
954{ return _lastExtraAttackSpell; }

References _lastExtraAttackSpell.

Referenced by HandleProcTriggerSpell().

◆ GetLevel()

uint8 Unit::GetLevel ( ) const
inline
@ UNIT_FIELD_LEVEL
Definition: UpdateFields.h:114

References Object::GetUInt32Value(), and UNIT_FIELD_LEVEL.

Referenced by Player::_ApplyItemBonuses(), Player::_ApplyWeaponDamage(), KillRewarder::_InitGroupData(), Pet::_LoadAuras(), KillRewarder::_RewardPlayer(), KillRewarder::_RewardXP(), Player::_SaveCharacter(), Player::_SaveStats(), spell_pal_ardent_defender::Absorb(), Pet::addSpell(), Spell::AddUnitTarget(), Player::ApplyEnchantment(), AuraEffect::AuraEffect(), BattlegroundMgr::BuildBattlegroundListPacket(), WorldSession::BuildPartyMemberStatsChangedPacket(), CalcArmorReducedDamage(), SpellInfo::CalcPowerCost(), SpellEffectInfo::CalcRadius(), spell_gen_disabled_above_63::CalculateAmount(), spell_item_arcane_shroud::CalculateAmount(), spell_item_the_eye_of_diminution::CalculateAmount(), AuraEffect::CalculateAmount(), CalculateLevelPenalty(), CalculateMeleeDamage(), Player::CalculateMinMaxDamage(), Player::CalculateQuestRewardXP(), Player::CalculateReputationGain(), Player::CalculateTalentsPoints(), SpellEffectInfo::CalcValue(), Player::CanEquipItem(), Group::CanJoinBattlegroundQueue(), Player::CanSeeStartQuest(), Player::CanUseItem(), Player::CheckAreaExploreAndOutdoor(), spell_hun_tame_beast::CheckCast(), Spell::CheckCast(), Spell::CheckEffectTarget(), spell_gen_proc_above_75::CheckLevel(), spell_gen_proc_reduced_above_60::CheckProc(), spell_item_green_whelp_armor::CheckProc(), Pet::CreateBaseAtTamed(), Player::CreatePet(), CreateTamedPetFrom(), DealMeleeDamage(), DoLowUnlearnCost(), DoMedUnlearnCost(), Spell::DoSpellHitOnUnit(), Spell::EffectAddHonor(), Spell::EffectApplyGlyph(), Spell::EffectDuel(), Spell::EffectEnergize(), Spell::EffectSchoolDMG(), Spell::EffectSkinning(), Spell::EffectTameCreature(), Pet::FillPetInfo(), lfg::LFGMgr::FinishDungeon(), Acore::XP::Gain(), Player::GetAverageItemLevel(), Player::GetAverageItemLevelForDF(), Player::GetBarberShopCost(), Player::GetBGAccessByLevel(), Pet::GetCurrentFoodBenefitLevel(), npc_wg_quest_giver::GetDialogStatus(), Player::GetDodgeFromAgility(), GetEffectiveResistChance(), SocialMgr::GetFriendInfo(), getLevelForTarget(), Creature::getLevelForTarget(), GetMaxSkillValueForLevel(), Player::GetMeleeCritFromAgility(), Pet::GetNativeObjectScale(), Player::GetQuestDialogStatus(), Player::GetQuestLevel(), Player::GetRatingMultiplier(), Creature::GetShieldBlockValue(), Player::GetSpellCritFromIntellect(), Player::GetsRecruitAFriendBonus(), Player::GetTrainerSpellState(), GetUnitMeleeSkill(), Player::GiveLevel(), Pet::GivePetLevel(), Pet::GivePetXP(), Player::GiveXP(), WorldSession::HandleAcceptGrantLevel(), OutdoorPvPSI::HandleAreaTrigger(), WorldSession::HandleArenaTeamInviteOpcode(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleBattlefieldStatusOpcode(), WorldSession::HandleBattlemasterJoinArena(), WorldSession::HandleBattlemasterJoinOpcode(), WorldSession::HandleCastSpellOpcode(), Player::HandleDrowning(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupInviteOpcode(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLfgPlayerLockInfoRequestOpcode(), Guild::HandleMemberDepositMoney(), Guild::HandleMemberWithdrawMoney(), WorldSession::HandleMessagechatOpcode(), npc_commandscript::HandleNpcInfoCommand(), WorldSession::HandleOfferPetitionOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandlePetitionSignOpcode(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), spell_pri_divine_aegis::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), reset_commandscript::HandleResetLevelCommand(), spell_wintergrasp_portal::HandleScript(), spell_item_scroll_of_recall::HandleScript(), WorldSession::HandleSendMail(), player_settings_commandscript::HandleSettingsAnnouncerFlags(), Player::InitGlyphsForLevel(), lfg::LFGMgr::InitializeLockedDungeons(), Pet::InitLevelupSpellsForLevel(), Puppet::InitStats(), TempSummon::InitStats(), Player::InitStatsForLevel(), Pet::InitTalentForLevel(), Player::InitTaxiNodesForLevel(), Battlefield::InvitePlayerToWar(), Creature::isCanTrainingAndResetTalentsOf(), Player::isHonorOrXPTarget(), Player::IsMaxLevel(), Player::LearnDefaultSkill(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), AchievementCriteriaData::Meets(), MeleeSpellHitResult(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), spell_item_with_mount_speed::OnApply(), item_generic_limit_chance_above_60::OnCastItemCombatSpell(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), Player::OnGossipSelect(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), Player::PrepareGossipMenu(), Player::Regenerate(), Player::RegenerateHealth(), Player::RemovedInsignia(), Pet::removeSpell(), Pet::resetTalents(), Player::ResurrectPlayer(), Player::RewardHonor(), Player::RewardQuest(), RewardRage(), Player::RewardReputation(), RollMeleeOutcomeAgainst(), ArenaTeam::Roster(), Player::Satisfy(), Player::SatisfyQuestLevel(), Pet::SavePetToDB(), CalendarMgr::SendCalendarEvent(), CalendarMgr::SendCalendarEventInvite(), WorldSession::SendLfgPlayerReward(), WorldSession::SendLfgRoleCheckUpdate(), Player::SendLoot(), PlayerMenu::SendQuestGiverOfferReward(), PlayerMenu::SendQuestGiverQuestDetails(), PlayerMenu::SendQuestQueryResponse(), Player::SendQuestReward(), ObjectMgr::SendServerMail(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), Player::SetRestBonus(), Guild::Member::SetStats(), SpellPctDamageModsDone(), Spell::SummonGuardian(), Player::SummonPet(), Pet::SynchronizeLevelWithOwner(), Aura::Update(), npc_pet_hunter_snake_trap::UpdateAI(), Player::UpdateAttackPowerAndDamage(), Player::UpdateCombatSkills(), Creature::UpdateEntry(), lfg::LFGMgr::UpdateRaidBrowser(), and GameObject::Use().

◆ getLevelForTarget()

◆ GetMagicHitRedirectTarget()

Unit * Unit::GetMagicHitRedirectTarget ( Unit victim,
SpellInfo const *  spellInfo 
)
11020{
11021 // Patch 1.2 notes: Spell Reflection no longer reflects abilities
11022 if (spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR1_NO_REDIRECTION) || spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
11023 return victim;
11024
11026 for (Unit::AuraEffectList::const_iterator itr = magnetAuras.begin(); itr != magnetAuras.end(); ++itr)
11027 {
11028 if (Unit* magnet = (*itr)->GetBase()->GetUnitOwner())
11029 if (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
11030 //&& spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK
11031 && _IsValidAttackTarget(magnet, spellInfo)
11032 /*&& IsWithinLOSInMap(magnet)*/)
11033 {
11034 // Xinef: We should choose minimum between flight time and queue time as in reflect, however we dont know flight time at this point, use arbitrary small number
11035 magnet->m_Events.AddEvent(new RedirectSpellEvent(*magnet, victim->GetGUID(), *itr), magnet->m_Events.CalculateQueueTime(100));
11036
11037 if (magnet->IsTotem())
11038 {
11039 uint64 queueTime = magnet->m_Events.CalculateQueueTime(100);
11040 if (spellInfo->Speed > 0.0f)
11041 {
11042 float dist = GetDistance(magnet->GetPositionX(), magnet->GetPositionY(), magnet->GetPositionZ());
11043 if (dist < 5.0f)
11044 dist = 5.0f;
11045 queueTime = magnet->m_Events.CalculateTime((uint64)std::floor(dist / spellInfo->Speed * 1000.0f));
11046 }
11047
11048 magnet->m_Events.AddEvent(new KillMagnetEvent(*magnet), queueTime);
11049 }
11050
11051 return magnet;
11052 }
11053 }
11054 return victim;
11055}
@ SPELL_ATTR1_NO_REDIRECTION
Definition: SharedDefines.h:422
@ SPELL_ATTR0_IS_ABILITY
Definition: SharedDefines.h:386
@ SPELL_AURA_SPELL_MAGNET
Definition: SpellAuraDefines.h:159
Definition: TotemAI.h:47
float GetDistance(WorldObject const *obj) const
Definition: Object.cpp:1245
bool _IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
Definition: Unit.cpp:13877
Definition: Unit.h:2187

References _IsValidAttackTarget(), SpellInfo::CheckExplicitTarget(), GetAuraEffectsByType(), WorldObject::GetDistance(), Object::GetGUID(), SpellInfo::HasAttribute(), SpellInfo::Speed, SPELL_ATTR0_IS_ABILITY, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_NO_REDIRECTION, SPELL_AURA_SPELL_MAGNET, and SPELL_CAST_OK.

Referenced by Spell::SelectExplicitTargets().

◆ GetMaxHealth()

uint32 Unit::GetMaxHealth ( ) const
inline
@ UNIT_FIELD_MAXHEALTH
Definition: UpdateFields.h:104

References Object::GetUInt32Value(), and UNIT_FIELD_MAXHEALTH.

Referenced by Player::_SaveStats(), boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_viscidus::boss_viscidus(), WorldSession::BuildPartyMemberStatsChangedPacket(), spell_item_skull_of_impeding_doom::CalculateDamageAmount(), CountPctFromMaxHealth(), boss_eregos::boss_eregosAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_alar::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_twinemperorsAI::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_heated_battle::npc_heated_battleAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), Spell::EffectHealMaxHealth(), Spell::EffectSummonPet(), boss_prince_keleseth_icc::boss_prince_kelesethAI::EnterEvadeMode(), boss_prince_taldaram_icc::boss_prince_taldaramAI::EnterEvadeMode(), boss_prince_valanar_icc::boss_prince_valanarAI::EnterEvadeMode(), Acore::XP::Gain(), GetHealthGain(), GetHealthPct(), npc_echo_of_medivh::GetPiece(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), HandleAuraProc(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), spell_oculus_soar_aura::HandleEffectPeriodic(), Player::HandleFall(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcInfoCommand(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceJustDied(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_stinky_precious_decimate::HandleScript(), IsFullHealth(), boss_twin_valkyrAI::JustEngagedWith(), boss_sister_svalna::boss_sister_svalnaAI::JustEngagedWith(), boss_ingvar_the_plunderer::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustReachedHome(), npc_dirt_mound::JustSummoned(), boss_skeram::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_gluth::boss_gluthAI::KilledUnit(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyHealth(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::operator()(), Player::outDebugValues(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), boss_prince_keleseth_icc::boss_prince_kelesethAI::Reset(), boss_prince_taldaram_icc::boss_prince_taldaramAI::Reset(), boss_prince_valanar_icc::boss_prince_valanarAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetFullHealth(), SetHealth(), boss_headless_horseman::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_simon_bunny::npc_simon_bunnyAI::SpellHitTarget(), npc_giant_claw_tentacle::Submerge(), boss_viscidus::SummonedCreatureDies(), boss_headless_horseman::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxNegativeAuraModifier()

int32 Unit::GetMaxNegativeAuraModifier ( AuraType  auratype) const
5950{
5951 int32 modifier = 0;
5952
5953 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5954 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5955 if ((*i)->GetAmount() < modifier)
5956 modifier = (*i)->GetAmount();
5957
5958 return modifier;
5959}

References GetAuraEffectsByType().

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), SpellHealingBonusTaken(), and UpdateSpeed().

◆ GetMaxNegativeAuraModifierByAffectMask()

int32 Unit::GetMaxNegativeAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6105{
6106 int32 modifier = 0;
6107
6108 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6109 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6110 {
6111 if ((*i)->IsAffectedOnSpell(affectedSpell) && (*i)->GetAmount() < modifier)
6112 modifier = (*i)->GetAmount();
6113 }
6114
6115 return modifier;
6116}

References GetAuraEffectsByType().

◆ GetMaxNegativeAuraModifierByMiscMask()

int32 Unit::GetMaxNegativeAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
6001{
6002 int32 modifier = 0;
6003
6004 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6005 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6006 {
6007 if ((*i)->GetMiscValue()& misc_mask && (*i)->GetAmount() < modifier)
6008 modifier = (*i)->GetAmount();
6009 }
6010
6011 return modifier;
6012}

References GetAuraEffectsByType().

Referenced by SpellTakenCritChance().

◆ GetMaxNegativeAuraModifierByMiscValue()

int32 Unit::GetMaxNegativeAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6053{
6054 int32 modifier = 0;
6055
6056 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6057 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6058 {
6059 if ((*i)->GetMiscValue() == misc_value && (*i)->GetAmount() < modifier)
6060 modifier = (*i)->GetAmount();
6061 }
6062
6063 return modifier;
6064}

References GetAuraEffectsByType().

Referenced by MagicSpellHitResult(), and ModSpellDuration().

◆ GetMaxPositiveAuraModifier()

int32 Unit::GetMaxPositiveAuraModifier ( AuraType  auratype)
5936{
5937 int32 modifier = 0;
5938
5939 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5940 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5941 {
5942 if ((*i)->GetAmount() > modifier)
5943 modifier = (*i)->GetAmount();
5944 }
5945
5946 return modifier;
5947}

References GetAuraEffectsByType().

Referenced by CalculateSpellAmount(), AuraEffect::HandlePeriodicHealAurasTick(), Player::RewardHonor(), SpellHealingBonusTaken(), and UpdateSpeed().

◆ GetMaxPositiveAuraModifierByAffectMask()

int32 Unit::GetMaxPositiveAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6091{
6092 int32 modifier = 0;
6093
6094 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6095 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6096 {
6097 if ((*i)->IsAffectedOnSpell(affectedSpell) && (*i)->GetAmount() > modifier)
6098 modifier = (*i)->GetAmount();
6099 }
6100
6101 return modifier;
6102}

References GetAuraEffectsByType().

◆ GetMaxPositiveAuraModifierByMiscMask()

int32 Unit::GetMaxPositiveAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask,
const AuraEffect except = nullptr 
) const
5987{
5988 int32 modifier = 0;
5989
5990 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5991 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5992 {
5993 if (except != (*i) && (*i)->GetMiscValue()& misc_mask && (*i)->GetAmount() > modifier)
5994 modifier = (*i)->GetAmount();
5995 }
5996
5997 return modifier;
5998}

References GetAuraEffectsByType(), and AuraEffect::GetMiscValue().

Referenced by AuraEffect::HandleAuraModResistanceExclusive(), and SpellTakenCritChance().

◆ GetMaxPositiveAuraModifierByMiscValue()

int32 Unit::GetMaxPositiveAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6039{
6040 int32 modifier = 0;
6041
6042 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6043 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6044 {
6045 if ((*i)->GetMiscValue() == misc_value && (*i)->GetAmount() > modifier)
6046 modifier = (*i)->GetAmount();
6047 }
6048
6049 return modifier;
6050}

References GetAuraEffectsByType().

Referenced by MagicSpellHitResult().

◆ GetMaxPower()

uint32 Unit::GetMaxPower ( Powers  power) const
inline
1057{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power); }
@ UNIT_FIELD_MAXPOWER1
Definition: UpdateFields.h:105

References Object::GetUInt32Value(), and UNIT_FIELD_MAXPOWER1.

Referenced by Player::_SaveStats(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), spell_gen_replenishment_aura::CalculateAmount(), spell_item_skull_of_impeding_doom::CalculateManaLeechAmount(), Spell::CheckItems(), Player::Create(), boss_shade_of_aran::DamageTaken(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerBurn(), Spell::EffectResurrect(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), GetPowerPct(), Player::GiveLevel(), HandleAuraProc(), Aura::HandleAuraSpecificMods(), HandleDummyAuraProc(), modify_commandscript::HandleModifyEnergyCommand(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_hun_ascpect_of_the_viper::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_kelthuzad_detonate_mana_aura::HandleScript(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), boss_curator::JustEngagedWith(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), ModifyPowerPct(), boss_shade_of_aran::OnPowerUpdate(), boss_selin_fireheart::OnPowerUpdate(), Acore::PowerPctOrderPred::operator()(), Player::outDebugValues(), spell_item_oracle_ablutions::PrepareSpellScript(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), spell_bronjahm_magic_bane::RecalculateDamage(), Creature::Regenerate(), Player::Regenerate(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetPower(), setPowerType(), Player::SummonPet(), boss_moam::UpdateAI(), boss_faction_championsAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI(), Player::UpdateCharmedAI(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxSkillValueForLevel()

uint16 Unit::GetMaxSkillValueForLevel ( Unit const *  target = nullptr) const
inline
1130{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }
uint8 getLevelForTarget(WorldObject const *) const override
Definition: Unit.h:1025

References GetLevel(), and getLevelForTarget().

Referenced by Player::GetMaxSkillValueForLevel(), GetUnitCriticalChance(), GetWeaponSkillValue(), isSpellBlocked(), MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), and SpellTakenCritChance().

◆ GetMechanicResistChance()

int32 Unit::GetMechanicResistChance ( SpellInfo const *  spell)
3134{
3135 if (!spell)
3136 return 0;
3137 int32 resist_mech = 0;
3138 for (uint8 eff = 0; eff < MAX_SPELL_EFFECTS; ++eff)
3139 {
3140 if (!spell->Effects[eff].IsEffect())
3141 break;
3142 int32 effect_mech = spell->GetEffectMechanic(eff);
3143 if (effect_mech)
3144 {
3146 if (resist_mech < temp)
3147 resist_mech = temp;
3148 }
3149 }
3150 return resist_mech;
3151}
@ SPELL_AURA_MOD_MECHANIC_RESISTANCE
Definition: SpellAuraDefines.h:180
int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:6014

References SpellInfo::Effects, SpellInfo::GetEffectMechanic(), GetTotalAuraModifierByMiscValue(), MAX_SPELL_EFFECTS, and SPELL_AURA_MOD_MECHANIC_RESISTANCE.

Referenced by MagicSpellHitResult(), and MeleeSpellHitResult().

◆ GetMeleeAttackPoint()

bool Unit::GetMeleeAttackPoint ( Unit attacker,
Position pos 
)
2668{
2669 if (!attacker)
2670 {
2671 return false;
2672 }
2673
2674 AttackerSet attackers = getAttackers();
2675
2676 if (attackers.size() <= 1) // if the attackers are not more than one
2677 {
2678 return false;
2679 }
2680
2681 float meleeReach = GetExactDist2d(attacker);
2682 if (meleeReach <= 0)
2683 {
2684 return false;
2685 }
2686
2687 float minAngle = 0;
2688 Unit *refUnit = nullptr;
2689 uint32 validAttackers = 0;
2690
2691 double attackerSize = attacker->GetCollisionRadius();
2692
2693 for (auto const& otherAttacker: attackers)
2694 {
2695 // if the otherAttacker is not valid, skip
2696 if (!otherAttacker || otherAttacker->GetGUID() == attacker->GetGUID() ||
2697 !otherAttacker->IsWithinMeleeRange(this) || otherAttacker->isMoving())
2698 {
2699 continue;
2700 }
2701
2702 float curretAngle = atan(attacker->GetExactDist2d(otherAttacker) / meleeReach);
2703 if (minAngle == 0 || curretAngle < minAngle)
2704 {
2705 minAngle = curretAngle;
2706 refUnit = otherAttacker;
2707 }
2708
2709 validAttackers++;
2710 }
2711
2712 if (!validAttackers || !refUnit)
2713 {
2714 return false;
2715 }
2716
2717 float contactDist = attackerSize + refUnit->GetCollisionRadius();
2718 float requiredAngle = atan(contactDist / meleeReach);
2719 float attackersAngle = atan(attacker->GetExactDist2d(refUnit) / meleeReach);
2720
2721 // in instance: the more attacker there are, the higher will be the tollerance
2722 // outside: creatures should not intersecate
2723 float angleTollerance = attacker->GetMap()->IsDungeon() ? requiredAngle - requiredAngle * tanh(validAttackers / 5.0f) : requiredAngle;
2724
2725 if (attackersAngle > angleTollerance)
2726 {
2727 return false;
2728 }
2729
2730 double angle = atan(contactDist / meleeReach);
2731
2732 float angularRadius = frand(0.1f, 0.3f) + angle;
2733 int8 direction = (urand(0, 1) ? -1 : 1);
2734 float currentAngle = GetAngle(refUnit);
2735 float absAngle = currentAngle + angularRadius * direction;
2736
2737 float x, y, z;
2738 float distance = meleeReach - GetObjectSize();
2739 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle);
2740
2741 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2742 {
2743 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle * -1); // try the other side
2744
2745 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2746 {
2747 return false;
2748 }
2749 }
2750
2751 pos.Relocate(x, y, z);
2752
2753 return true;
2754}
float frand(float min, float max)
Definition: Random.cpp:57
std::int8_t int8
Definition: Define.h:105
void GetNearPoint(WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
Definition: Object.cpp:2626
float GetExactDist2d(const float x, const float y) const
Definition: Position.h:165
float GetCollisionRadius() const override
this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by t...
Definition: Unit.cpp:21101
std::unordered_set< Unit * > AttackerSet
Definition: Unit.h:632
AttackerSet const & getAttackers() const
Definition: Unit.h:850
bool IsDungeon() const
Definition: Map.h:446

References frand(), Position::GetAngle(), getAttackers(), GetCollisionRadius(), Position::GetExactDist2d(), Object::GetGUID(), WorldObject::GetMap(), WorldObject::GetNearPoint(), WorldObject::GetObjectSize(), Map::IsDungeon(), Position::Relocate(), and urand().

Referenced by MotionMaster::MoveCircleTarget().

◆ GetMeleeCritChanceReduction()

float Unit::GetMeleeCritChanceReduction ( ) const
inline

◆ GetMeleeCritDamageReduction()

uint32 Unit::GetMeleeCritDamageReduction ( uint32  damage) const
inline
1199{ return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_MELEE, 2.2f, 33.0f, damage); }
uint32 GetCombatRatingDamageReduction(CombatRating cr, float rate, float cap, uint32 damage) const
Definition: Unit.cpp:19195

References CR_CRIT_TAKEN_MELEE, and GetCombatRatingDamageReduction().

Referenced by ApplyResilience(), and processDummyAuras().

◆ GetMeleeDamageReduction()

uint32 Unit::GetMeleeDamageReduction ( uint32  damage) const
inline

◆ GetMeleeDamageSchoolMask()

virtual SpellSchoolMask Unit::GetMeleeDamageSchoolMask ( WeaponAttackType  attackType = BASE_ATTACK,
uint8  damageIndex = 0 
) const
pure virtual

Implemented in Player, and Creature.

Referenced by CalculateMeleeDamage().

◆ GetMeleeHitRedirectTarget()

Unit * Unit::GetMeleeHitRedirectTarget ( Unit victim,
SpellInfo const *  spellInfo = nullptr 
)
11058{
11060 for (AuraEffectList::const_iterator i = hitTriggerAuras.begin(); i != hitTriggerAuras.end(); ++i)
11061 {
11062 if (Unit* magnet = (*i)->GetBase()->GetCaster())
11063 if (_IsValidAttackTarget(magnet, spellInfo) && magnet->IsWithinLOSInMap(this)
11064 && (!spellInfo || (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
11065 && spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK)))
11066 if (roll_chance_i((*i)->GetAmount()))
11067 {
11068 (*i)->GetBase()->DropCharge(AURA_REMOVE_BY_EXPIRE);
11069 return magnet;
11070 }
11071 }
11072 return victim;
11073}
bool roll_chance_i(int chance)
Definition: Random.h:59
@ SPELL_AURA_ADD_CASTER_HIT_TRIGGER
Definition: SpellAuraDefines.h:174

References _IsValidAttackTarget(), AURA_REMOVE_BY_EXPIRE, SpellInfo::CheckExplicitTarget(), SpellInfo::CheckTarget(), GetAuraEffectsByType(), roll_chance_i(), SPELL_AURA_ADD_CASTER_HIT_TRIGGER, and SPELL_CAST_OK.

Referenced by AttackerStateUpdate(), spell_dk_dancing_rune_weapon::HandleProc(), and Spell::SelectExplicitTargets().

◆ GetMeleeRange()

float Unit::GetMeleeRange ( Unit const *  target) const
680{
681 float range = GetCombatReach() + target->GetCombatReach() + 4.0f / 3.0f;
682 return std::max(range, NOMINAL_MELEE_RANGE);
683}
#define NOMINAL_MELEE_RANGE
Definition: ObjectDefines.h:48
float GetCombatReach() const override
Definition: Unit.h:828

References GetCombatReach(), and NOMINAL_MELEE_RANGE.

Referenced by GetRandomContactPoint(), IsWithinMeleeRange(), CreatureAI::MoveBackwardsChecks(), and SmartScript::ProcessAction().

◆ GetMeleeReach()

float Unit::GetMeleeReach ( ) const
inline
829{ float reach = m_floatValues[UNIT_FIELD_COMBATREACH]; return reach > MIN_MELEE_REACH ? reach : MIN_MELEE_REACH; }
#define MIN_MELEE_REACH
Definition: ObjectDefines.h:47

References Object::m_floatValues, MIN_MELEE_REACH, and UNIT_FIELD_COMBATREACH.

Referenced by boss_veknilash::JustEngagedWith(), and npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI().

◆ GetMinionGUID()

ObjectGuid Unit::GetMinionGUID ( ) const
inline
@ UNIT_FIELD_SUMMON
Definition: UpdateFields.h:87

References Object::GetGuidValue(), and UNIT_FIELD_SUMMON.

Referenced by GetFirstControlled(), GetFirstMinion(), and OutDebugInfo().

◆ GetModelForForm()

uint32 Unit::GetModelForForm ( ShapeshiftForm  form,
uint32  spellId 
) const
19202{
19203 // Hardcoded cases
19204 switch (spellId)
19205 {
19206 case 7090: // Bear form
19207 return 29414;
19208 case 35200: // Roc form
19209 return 4877;
19210 default:
19211 break;
19212 }
19213
19214 if (IsPlayer())
19215 {
19216 switch (form)
19217 {
19218 case FORM_CAT:
19219 // Based on Hair color
19220 if (getRace() == RACE_NIGHTELF)
19221 {
19222 uint8 hairColor = GetByteValue(PLAYER_BYTES, 3);
19223 switch (hairColor)
19224 {
19225 case 7: // Violet
19226 case 8:
19227 return 29405;
19228 case 3: // Light Blue
19229 return 29406;
19230 case 0: // Green
19231 case 1: // Light Green
19232 case 2: // Dark Green
19233 return 29407;
19234 case 4: // White
19235 return 29408;
19236 default: // original - Dark Blue
19237 return 892;
19238 }
19239 }
19240 // Based on Skin color
19241 else if (getRace() == RACE_TAUREN)
19242 {
19243 uint8 skinColor = GetByteValue(PLAYER_BYTES, 0);
19244 // Male
19245 if (getGender() == GENDER_MALE)
19246 {
19247 switch (skinColor)
19248 {
19249 case 12: // White
19250 case 13:
19251 case 14:
19252 case 18: // Completly White
19253 return 29409;
19254 case 9: // Light Brown
19255 case 10:
19256 case 11:
19257 return 29410;
19258 case 6: // Brown
19259 case 7:
19260 case 8:
19261 return 29411;
19262 case 0: // Dark
19263 case 1:
19264 case 2:
19265 case 3: // Dark Grey
19266 case 4:
19267 case 5:
19268 return 29412;
19269 default: // original - Grey
19270 return 8571;
19271 }
19272 }
19273 // Female
19274 else switch (skinColor)
19275 {
19276 case 10: // White
19277 return 29409;
19278 case 6: // Light Brown
19279 case 7:
19280 return 29410;
19281 case 4: // Brown
19282 case 5:
19283 return 29411;
19284 case 0: // Dark
19285 case 1:
19286 case 2:
19287 case 3:
19288 return 29412;
19289 default: // original - Grey
19290 return 8571;
19291 }
19292 }
19294 return 892;
19295 else
19296 return 8571;
19297 case FORM_DIREBEAR:
19298 case FORM_BEAR:
19299 // Based on Hair color
19300 if (getRace() == RACE_NIGHTELF)
19301 {
19302 uint8 hairColor = GetByteValue(PLAYER_BYTES, 3);
19303 switch (hairColor)
19304 {
19305 case 0: // Green
19306 case 1: // Light Green
19307 case 2: // Dark Green
19308 return 29413; // 29415?
19309 case 6: // Dark Blue
19310 return 29414;
19311 case 4: // White
19312 return 29416;
19313 case 3: // Light Blue
19314 return 29417;
19315 default: // original - Violet
19316 return 2281;
19317 }
19318 }
19319 // Based on Skin color
19320 else if (getRace() == RACE_TAUREN)
19321 {
19322 uint8 skinColor = GetByteValue(PLAYER_BYTES, 0);
19323 // Male
19324 if (getGender() == GENDER_MALE)
19325 {
19326 switch (skinColor)
19327 {
19328 case 0: // Dark (Black)
19329 case 1:
19330 case 2:
19331 return 29418;
19332 case 3: // White
19333 case 4:
19334 case 5:
19335 case 12:
19336 case 13:
19337 case 14:
19338 return 29419;
19339 case 9: // Light Brown/Grey
19340 case 10:
19341 case 11:
19342 case 15:
19343 case 16:
19344 case 17:
19345 return 29420;
19346 case 18: // Completly White
19347 return 29421;
19348 default: // original - Brown
19349 return 2289;
19350 }
19351 }
19352 // Female
19353 else switch (skinColor)
19354 {
19355 case 0: // Dark (Black)
19356 case 1:
19357 return 29418;
19358 case 2: // White
19359 case 3:
19360 return 29419;
19361 case 6: // Light Brown/Grey
19362 case 7:
19363 case 8:
19364 case 9:
19365 return 29420;
19366 case 10: // Completly White
19367 return 29421;
19368 default: // original - Brown
19369 return 2289;
19370 }
19371 }
19373 return 2281;
19374 else
19375 return 2289;
19376 case FORM_FLIGHT:
19378 return 20857;
19379 return 20872;
19380 case FORM_FLIGHT_EPIC:
19382 return 21243;
19383 return 21244;
19384 default:
19385 break;
19386 }
19387 }
19388
19389 uint32 modelid = 0;
19390 SpellShapeshiftFormEntry const* formEntry = sSpellShapeshiftFormStore.LookupEntry(form);
19391 if (formEntry && formEntry->modelID_A)
19392 {
19393 // Take the alliance modelid as default
19394 if (!IsPlayer())
19395 return formEntry->modelID_A;
19396 else
19397 {
19399 modelid = formEntry->modelID_A;
19400 else
19401 modelid = formEntry->modelID_H;
19402
19403 // If the player is horde but there are no values for the horde modelid - take the alliance modelid
19404 if (!modelid && Player::TeamIdForRace(getRace()) == TEAM_HORDE)
19405 modelid = formEntry->modelID_A;
19406 }
19407 }
19408
19409 return modelid;
19410}
@ GENDER_MALE
Definition: SharedDefines.h:61
@ RACE_NIGHTELF
Definition: SharedDefines.h:74
@ RACE_TAUREN
Definition: SharedDefines.h:76
@ TEAM_ALLIANCE
Definition: SharedDefines.h:760
@ TEAM_HORDE
Definition: SharedDefines.h:761
@ PLAYER_BYTES
Definition: UpdateFields.h:181
@ FORM_DIREBEAR
Definition: UnitDefines.h:77
@ FORM_FLIGHT_EPIC
Definition: UnitDefines.h:94
@ FORM_CAT
Definition: UnitDefines.h:70
@ FORM_FLIGHT
Definition: UnitDefines.h:96
@ FORM_BEAR
Definition: UnitDefines.h:74
static TeamId TeamIdForRace(uint8 race)
Definition: Player.cpp:5839
uint8 getGender() const
Definition: Unit.h:805
uint8 getRace(bool original=false) const
Definition: Unit.cpp:21007
uint32 modelID_H
Definition: DBCStructure.h:1826
uint32 modelID_A
Definition: DBCStructure.h:1825

References FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_FLIGHT, FORM_FLIGHT_EPIC, GENDER_MALE, Object::GetByteValue(), getGender(), getRace(), Object::IsPlayer(), SpellShapeshiftFormEntry::modelID_A, SpellShapeshiftFormEntry::modelID_H, PLAYER_BYTES, RACE_NIGHTELF, RACE_TAUREN, sSpellShapeshiftFormStore, TEAM_ALLIANCE, TEAM_HORDE, and Player::TeamIdForRace().

Referenced by AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), and RestoreDisplayId().

◆ GetModelForTotem()

uint32 Unit::GetModelForTotem ( PlayerTotemType  totemType)
19413{
19414 switch (getRace())
19415 {
19416 case RACE_ORC:
19417 {
19418 switch (totemType)
19419 {
19420 case SUMMON_TYPE_TOTEM_FIRE: // fire
19421 return 30758;
19422 case SUMMON_TYPE_TOTEM_EARTH: // earth
19423 return 30757;
19424 case SUMMON_TYPE_TOTEM_WATER: // water
19425 return 30759;
19426 case SUMMON_TYPE_TOTEM_AIR: // air
19427 return 30756;
19428 }
19429 break;
19430 }
19431 case RACE_DWARF:
19432 {
19433 switch (totemType)
19434 {
19435 case SUMMON_TYPE_TOTEM_FIRE: // fire
19436 return 30754;
19437 case SUMMON_TYPE_TOTEM_EARTH: // earth
19438 return 30753;
19439 case SUMMON_TYPE_TOTEM_WATER: // water
19440 return 30755;
19441 case SUMMON_TYPE_TOTEM_AIR: // air
19442 return 30736;
19443 }
19444 break;
19445 }
19446 case RACE_TROLL:
19447 {
19448 switch (totemType)
19449 {
19450 case SUMMON_TYPE_TOTEM_FIRE: // fire
19451 return 30762;
19452 case SUMMON_TYPE_TOTEM_EARTH: // earth
19453 return 30761;
19454 case SUMMON_TYPE_TOTEM_WATER: // water
19455 return 30763;
19456 case SUMMON_TYPE_TOTEM_AIR: // air
19457 return 30760;
19458 }
19459 break;
19460 }
19461 case RACE_TAUREN:
19462 {
19463 switch (totemType)
19464 {
19465 case SUMMON_TYPE_TOTEM_FIRE: // fire
19466 return 4589;
19467 case SUMMON_TYPE_TOTEM_EARTH: // earth
19468 return 4588;
19469 case SUMMON_TYPE_TOTEM_WATER: // water
19470 return 4587;
19471 case SUMMON_TYPE_TOTEM_AIR: // air
19472 return 4590;
19473 }
19474 break;
19475 }
19476 case RACE_DRAENEI:
19477 {
19478 switch (totemType)
19479 {
19480 case SUMMON_TYPE_TOTEM_FIRE: // fire
19481 return 19074;
19482 case SUMMON_TYPE_TOTEM_EARTH: // earth
19483 return 19073;
19484 case SUMMON_TYPE_TOTEM_WATER: // water
19485 return 19075;
19486 case SUMMON_TYPE_TOTEM_AIR: // air
19487 return 19071;
19488 }
19489 break;
19490 }
19491 default: // One standard for other races.
19492 {
19493 switch (totemType)
19494 {
19495 case SUMMON_TYPE_TOTEM_FIRE: // fire
19496 return 4589;
19497 case SUMMON_TYPE_TOTEM_EARTH: // earth
19498 return 4588;
19499 case SUMMON_TYPE_TOTEM_WATER: // water
19500 return 4587;
19501 case SUMMON_TYPE_TOTEM_AIR: // air
19502 return 4590;
19503 }
19504 break;
19505 }
19506 }
19507 return 0;
19508}
@ RACE_TROLL
Definition: SharedDefines.h:78
@ RACE_ORC
Definition: SharedDefines.h:72
@ RACE_DRAENEI
Definition: SharedDefines.h:81
@ RACE_DWARF
Definition: SharedDefines.h:73
@ SUMMON_TYPE_TOTEM_EARTH
Definition: Unit.h:608
@ SUMMON_TYPE_TOTEM_WATER
Definition: Unit.h:609
@ SUMMON_TYPE_TOTEM_FIRE
Definition: Unit.h:607
@ SUMMON_TYPE_TOTEM_AIR
Definition: Unit.h:610

References getRace(), RACE_DRAENEI, RACE_DWARF, RACE_ORC, RACE_TAUREN, RACE_TROLL, SUMMON_TYPE_TOTEM_AIR, SUMMON_TYPE_TOTEM_EARTH, SUMMON_TYPE_TOTEM_FIRE, and SUMMON_TYPE_TOTEM_WATER.

◆ GetModifierValue()

float Unit::GetModifierValue ( UnitMods  unitMod,
UnitModifierType  modifierType 
) const
15289{
15290 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
15291 {
15292 LOG_ERROR("entities.unit", "attempt to access non-existing modifier value from UnitMods!");
15293 return 0.0f;
15294 }
15295
15296 if (modifierType == TOTAL_PCT && m_auraModifiersGroup[unitMod][modifierType] <= 0.0f)
15297 return 0.0f;
15298
15299 return m_auraModifiersGroup[unitMod][modifierType];
15300}
@ MODIFIER_TYPE_END
Definition: Unit.h:130

References LOG_ERROR, m_auraModifiersGroup, MODIFIER_TYPE_END, TOTAL_PCT, and UNIT_MOD_END.

Referenced by Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), Spell::EffectWeaponDmg(), Guardian::UpdateArmor(), Player::UpdateArmor(), Creature::UpdateAttackPowerAndDamage(), Guardian::UpdateAttackPowerAndDamage(), Player::UpdateAttackPowerAndDamage(), Guardian::UpdateDamagePhysical(), Guardian::UpdateMaxHealth(), Player::UpdateMaxHealth(), Guardian::UpdateMaxPower(), Player::UpdateMaxPower(), and Player::UpdateResistances().

◆ GetMotionMaster() [1/2]

MotionMaster * Unit::GetMotionMaster ( )
inline
1620{ return i_motionMaster; }

References i_motionMaster.

Referenced by _ExitVehicle(), HomeMovementGenerator< Creature >::_setTargetLocation(), PetAI::_stopAttack(), BattlegroundAV::AddAVCreature(), npc_mograine::npc_mograineAI::AshbringerEvent(), UnitAI::AttackStart(), FollowerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::boss_malygosAI::AttackStart(), npc_nexus_lord::npc_nexus_lordAI::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::AttackStart(), boss_magus_telestra::AttackStart(), boss_razorscale::boss_razorscaleAI::AttackStart(), boss_lady_malande::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), npc_capernian::AttackStart(), UnitAI::AttackStartCaster(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CleanupBeforeRemoveFromMap(), boss_alar::ConstructWaypointsAndMove(), boss_isalien::DamageTaken(), boss_julianne::DamageTaken(), npc_mograine::npc_mograineAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_nightbane::DoAction(), npc_apothecary_genericAI::DoAction(), npc_harrison_jones::DoAction(), npc_amanishi_lookout::DoAction(), npc_chained_spirit::DoAction(), boss_anetheron::DoAction(), boss_azgalor::DoAction(), boss_kazrogal::DoAction(), boss_rage_winterchill::DoAction(), npc_hyjal_ground_trash::DoAction(), npc_hyjal_gargoyle::DoAction(), npc_hyjal_frost_wyrm::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_saurfang_event::npc_saurfang_eventAI::DoAction(), boss_professor_putricide::boss_professor_putricideAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), npc_argent_captainAI::DoAction(), npc_icc_spire_frostwyrm::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::DoAction(), npc_ahune_bunny::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_living_mojo::npc_living_mojoAI::DoAction(), npc_power_spark::npc_power_sparkAI::DoAction(), npc_hover_disk::npc_hover_diskAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), boss_skadi::boss_skadiAI::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), boss_ambassador_hellmaw::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), npc_maiev_illidan::DoAction(), npc_akama_shade::DoAction(), boss_nazan::DoAction(), boss_ghazan::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), PetAI::DoAttack(), Creature::DoFleeToGetAssistance(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoStartMovement(), ScriptedAI::DoStartNoMovement(), go_commandscript::DoTeleport(), Spell::EffectCharge(), Spell::EffectChargeDest(), Spell::EffectDistract(), Spell::EffectJump(), Spell::EffectJumpDest(), Spell::EffectPullTowards(), Spell::EffectSummonType(), boss_jindo::EnterEvadeMode(), npc_black_morass_summoned_add::EnterEvadeMode(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), npc_argent_captainAI::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), npc_burning_spirit::npc_burning_spiritAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_mrfloppy::npc_mrfloppyAI::EnterEvadeMode(), npc_pet_gen_argent_pony_bridle::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), boss_halazzi::EnterPhase(), boss_zuljin::EnterPhase(), VehicleDespawnEvent::Execute(), RestoreAttack::Execute(), OrcMoveEvent::Execute(), NpcRunToHome::Execute(), UtherBatteredHiltEvent::Execute(), SlaveRunEvent::Execute(), DelayedMovementEvent::Execute(), DaranavanMoveEvent::Execute(), FrostwyrmLandEvent::Execute(), SACActivateEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), AssistanceMovementGenerator::Finalize(), npc_dark_iron_guzzler::FindNextKeg(), npc_hallows_end_soh::FinishEvent(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::FinishQuest(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::FlyAway(), boss_nightbane::FlyToClosestPreFlyWayPoint(), Creature::FocusTarget(), CreatureGroup::FormationReset(), boss_volkhan::boss_volkhanAI::GoToAnvil(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_apothecary_lingering_fumes::HandleAfterCast(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), misc_commandscript::HandleAppearCommand(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), misc_commandscript::HandleComeToMeCommand(), spell_q12589_shoot_rjr::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_icc_geist_alarm::HandleEvent(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoTicketCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), spell_item_toxic_wasteling::HandleJump(), AuraEffect::HandleModPossessPet(), misc_commandscript::HandleMovegensCommand(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), npc_commandscript::HandleNpcFollowCommand(), npc_commandscript::HandleNpcMoveCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetWanderDistanceCommand(), npc_commandscript::HandleNpcUnFollowCommand(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePlayerLoginFromDB(), spell_entropius_black_hole_effect::HandlePull(), spell_boss_magus_telestra_gravity_well::HandlePull(), PetAI::HandleReturnMovement(), spell_the_lich_king_valkyr_target_search::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_gen_ayamiss_swarmer_loop::HandleScript(), WorldSession::HandleSetRaidDifficultyOpcode(), spell_sindragosa_icy_grip_jump::HandleSpecial(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::HandleSpeedChangeIfNeeded(), spell_item_draenic_pale_ale::HandleSummon(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), wp_commandscript::HandleWpLoadCommand(), wp_commandscript::HandleWpUnLoadCommand(), boss_captain_skarloc::InitializeAI(), boss_lieutenant_drake::InitializeAI(), boss_glob_of_viscidus::InitializeAI(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), boss_eck::boss_eckAI::InitializeAI(), npc_preparations_for_war_vehicle::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::InitializeAI(), npc_pet_dk_dancing_rune_weapon::npc_pet_dk_dancing_rune_weaponAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), Totem::InitSummon(), boss_grand_warlock_nethekurse::IntroRP(), Creature::IsFreeToMove(), IsMutualChase(), boss_gahzranka::IsSummonedBy(), boss_aeonus::IsSummonedBy(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::IsSummonedBy(), npc_burning_spirit::npc_burning_spiritAI::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::IsSummonedBy(), npc_spirit_shade::npc_spirit_shadeAI::IsSummonedBy(), JumpTo(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), boss_ayamiss::JustDied(), npc_cyclone::JustEngagedWith(), boss_akilzon::JustEngagedWith(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_grandmaster_vorpil::JustEngagedWith(), boss_warlord_kalithresh::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_nazan::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_ayamiss::JustEngagedWith(), boss_janalai::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_alar::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), SmartAI::JustReachedHome(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::JustReachedHome(), npc_akama_illidan::JustReachedHome(), boss_ghazan::JustReachedHome(), boss_grand_warlock_nethekurse::JustReachedHome(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), boss_auriaya::boss_auriayaAI::JustSummoned(), npc_frosthound::npc_frosthoundAI::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), boss_mekgineer_steamrigger::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_xevozz::boss_xevozzAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::JustSummoned(), boss_ingvar_the_plunderer::JustSummoned(), boss_vexallus::JustSummoned(), npc_kalecgos_kj::JustSummoned(), boss_janalai::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustSummoned(), npc_medivh_bm::JustSummoned(), boss_hadronox::boss_hadronoxAI::JustSummoned(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::JustSummoned(), boss_sartharion::boss_sartharionAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_akama_shade::JustSummoned(), npc_creature_generator_akama::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), boss_mennu_the_betrayer::JustSummoned(), boss_kaelthas::JustSummoned(), boss_mechano_lord_capacitus::JustSummoned(), npc_rinji::npc_rinjiAI::JustSummoned(), npc_maghar_captive::npc_maghar_captiveAI::JustSummoned(), boss_ayamiss::JustSummoned(), Player::KillPlayer(), KnockbackFrom(), spell_svalna_revive_champion::Land(), CreatureGroup::LeaderMoveTo(), Player::LeaveBattleground(), Creature::Motion_Initialize(), SmartAI::MoveAway(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), boss_nalorakk::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::MoveInLineOfSight(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), PetAI::MovementInform(), boss_ebonroc::boss_ebonrocAI::MovementInform(), boss_nightbane::MovementInform(), npc_harrison_jones::MovementInform(), boss_bug_trio::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_four_horsemen::boss_four_horsemenAI::MovementInform(), npc_akama_illidan::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), boss_felmyst::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_cameron::MoveTheChildren(), boss_four_horsemen::boss_four_horsemenAI::MoveToCorner(), npc_janalai_hatcher::MoveToNewWaypoint(), npc_concentrated_ball::npc_concentrated_ballAI::MoveToNextPoint(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), NearTeleportTo(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), npc_collapsing_star::npc_collapsing_starAI::npc_collapsing_starAI(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_omen::npc_omenAI::npc_omenAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::npc_pos_after_first_bossAI(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vaporsAI::npc_ulduar_saronite_vaporsAI(), spell_halion_twilight_phasing_aura::OnApply(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_hyjal_jaina::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_kernobee::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), spell_chapter5_light_of_dawn_aura::OnRemove(), spell_halion_twilight_phasing_aura::OnRemove(), SplineHandler::operator()(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_oculus_drake::npc_oculus_drakeAI::PassengerBoarded(), npc_vics_flying_machine::npc_vics_flying_machineAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), boss_nightbane::PathEndReached(), boss_anetheron::PathEndReached(), boss_rage_winterchill::PathEndReached(), npc_hyjal_ground_trash::PathEndReached(), npc_hyjal_frost_wyrm::PathEndReached(), boss_ambassador_hellmaw::PathEndReached(), npc_akama_illidan::PathEndReached(), boss_nefarian::PathEndReached(), npc_hyjal_gargoyle::PathEndReached(), PauseMovement(), SmartAI::PausePath(), PetSpellFail(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::PickNewLocation(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), boss_alar::PretendToDie(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), propagateSpeedChange(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), RemoveCharmedBy(), boss_the_beast::boss_thebeastAI::Reset(), boss_felblood_kaelthas::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_kalec::Reset(), npc_singularity::Reset(), boss_janalai::Reset(), npc_janalai_hatcher::Reset(), boss_arlokk::boss_arlokkAI::Reset(), npc_zulian_prowler::npc_zulian_prowlerAI::Reset(), npc_batrider::Reset(), npc_brew_bubble::Reset(), boss_archimonde::Reset(), boss_ayamiss::Reset(), boss_bug_trio::Reset(), boss_jedoga_shadowseeker::Reset(), npc_kinetic_bomb::npc_kinetic_bombAI::Reset(), npc_assembly_lightning::npc_assembly_lightningAI::Reset(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::Reset(), npc_xt002_boombot::npc_xt002_boombotAI::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_released_offspring_harkoa::npc_released_offspring_harkoaAI::Reset(), npc_voidtraveler::Reset(), boss_lady_vashj::Reset(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_infernal_attacker::npc_infernal_attackerAI::Reset(), npc_pet_gen_gnomish_flame_turret::Reset(), Creature::Respawn(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), ResumeMovement(), SmartAI::ResumePath(), Resurrect(), SmartAI::ReturnToLastOOCPos(), npc_escortAI::ReturnToLastPoint(), boss_alar::ScheduleAbilities(), boss_illidan_stormrage::ScheduleAbilities(), boss_magtheridon::ScheduleCombatEvents(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), boss_felmyst::ScheduleFlightAbilities(), boss_felmyst::ScheduleFlightSequence(), boss_nightbane::ScheduleLand(), boss_laj::ScheduleTasks(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), WorldSession::SendDoFlight(), boss_sartharion::boss_sartharionAI::SendLavaWaves(), SetCharmedBy(), SmartAI::SetCombatMove(), SetConfused(), boss_grand_warlock_nethekurse::SetData(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::SetData(), gunship_npc_AI::SetData(), npc_enslaved_proto_drake::SetData(), boss_the_beast::boss_thebeastAI::SetData(), npc_eastvale_peasent::SetData(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::SetData(), setDeathState(), Creature::setDeathState(), SetFeared(), SmartAI::SetFollow(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::SetGUID(), SetInCombatState(), Player::SetMover(), SetSpeed(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_harrison_jones::sGossipSelect(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_akama_illidan::sGossipSelect(), npc_akama_shade::sGossipSelect(), boss_thorim::boss_thorimAI::SpawnArenaNPCs(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_thrall_bfu::npc_thrall_bfuAI::SpawnWave(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::SpellHit(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::SpellHit(), npc_saurfang_event::npc_saurfang_eventAI::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_crusade_persuaded::npc_crusade_persuadedAI::SpellHit(), npc_forest_frog::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::SpellHit(), npc_iron_watcher::npc_iron_watcherAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_quartermaster_zigris::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), npc_pet_gen_fetch_ball::SpellHitTarget(), boss_ionar::boss_ionarAI::Split(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_escortAI::Start(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), FollowerAI::StartFollow(), boss_felmyst::StartIntro(), WaypointMovementGenerator< Creature >::StartMove(), npc_stillpine_capitive::npc_stillpine_capitiveAI::StartMoving(), SmartAI::StartPath(), SmartAI::StopFollow(), SmartAI::StopPath(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_vazruden_the_herald::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), Spell::SummonGuardian(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::SummonNextWave(), Player::TeleportTo(), CreatureAI::TriggerAlert(), Pet::Update(), Update(), SimpleCharmedAI::UpdateAI(), npc_escortAI::UpdateAI(), boss_gyth::boss_gythAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_eye_of_acherus::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_cameron::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_grand_magister_rommath::npc_grand_magister_rommathAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_akilzon_eagle::UpdateAI(), npc_forest_frog::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_elder_kekek::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_lieutenant_drake::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), npc_twilight_volunteer::UpdateAI(), npc_taldaram_flamesphere::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::UpdateAI(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_emergency_fire_bot::npc_ulduar_emergency_fire_botAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_preparations_for_war_vehicle::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_wintergarde_gryphon::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_venture_co_straggler::npc_venture_co_stragglerAI::UpdateAI(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), PetAI::UpdateAI(), FollowerAI::UpdateAI(), npc_demonic_vapor::UpdateAI(), npc_batrider::UpdateAI(), npc_concentrated_ball::npc_concentrated_ballAI::UpdateAI(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::UpdateAI(), npc_xt002_boombot::npc_xt002_boombotAI::UpdateAI(), Player::UpdateCharmedAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_emily::npc_emilyAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ GetMotionMaster() [2/2]

const MotionMaster * Unit::GetMotionMaster ( ) const
inline
1621{ return i_motionMaster; }

References i_motionMaster.

◆ GetMountID()

◆ GetNativeDisplayId()

◆ GetNativeObjectScale()

virtual float Unit::GetNativeObjectScale ( ) const
inlinevirtual

Reimplemented in Creature, and Pet.

1835{ return 1.0f; }

Referenced by RecalculateObjectScale().

◆ GetNegStat()

float Unit::GetNegStat ( Stats  stat) const
inline
1004{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_NEGSTAT0.

◆ GetNextRandomRaidMemberOrPet()

Unit * Unit::GetNextRandomRaidMemberOrPet ( float  radius)
11115{
11116 Player* player = nullptr;
11117 if (IsPlayer())
11118 player = ToPlayer();
11119 // Should we enable this also for charmed units?
11120 else if (IsCreature() && IsPet())
11121 player = GetOwner()->ToPlayer();
11122
11123 if (!player)
11124 return nullptr;
11125 Group* group = player->GetGroup();
11126 // When there is no group check pet presence
11127 if (!group)
11128 {
11129 // We are pet now, return owner
11130 if (player != this)
11131 return IsWithinDistInMap(player, radius) ? player : nullptr;
11132 Unit* pet = GetGuardianPet();
11133 // No pet, no group, nothing to return
11134 if (!pet)
11135 return nullptr;
11136 // We are owner now, return pet
11137 return IsWithinDistInMap(pet, radius) ? pet : nullptr;
11138 }
11139
11140 std::vector<Unit*> nearMembers;
11141 // reserve place for players and pets because resizing vector every unit push is unefficient (vector is reallocated then)
11142 nearMembers.reserve(group->GetMembersCount() * 2);
11143
11144 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
11145 if (Player* Target = itr->GetSource())
11146 {
11147 if (Target != this && !IsWithinDistInMap(Target, radius))
11148 continue;
11149
11150 // IsHostileTo check duel and controlled by enemy
11151 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
11152 nearMembers.push_back(Target);
11153
11154 // Push player's pet to vector
11155 if (Unit* pet = Target->GetGuardianPet())
11156 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
11157 nearMembers.push_back(pet);
11158 }
11159
11160 if (nearMembers.empty())
11161 return nullptr;
11162
11163 uint32 randTarget = urand(0, nearMembers.size() - 1);
11164 return nearMembers[randTarget];
11165}
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition: Object.cpp:1321
Group * GetGroup()
Definition: Player.h:2451
Guardian * GetGuardianPet() const
Definition: Unit.cpp:10651
Definition: Group.h:169
uint32 GetMembersCount() const
Definition: Group.h:245
GroupReference * GetFirstMember()
Definition: Group.h:243
Definition: GroupReference.h:27
GroupReference * next()
Definition: GroupReference.h:36

References Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), Group::GetMembersCount(), GetOwner(), Object::IsCreature(), IsHostileTo(), IsPet(), Object::IsPlayer(), WorldObject::IsWithinDistInMap(), GroupReference::next(), Object::ToPlayer(), and urand().

Referenced by HandleAuraRaidProcFromCharge(), and AuraEffect::HandleRaidProcFromChargeAuraProc().

◆ GetNpcFlags()

◆ GetOldFactionId()

uint32 Unit::GetOldFactionId ( ) const
inline
812{ return _oldFactionId; }

References _oldFactionId.

Referenced by npc_chesspiece::OnCharmed().

◆ GetOwnedAura()

Aura * Unit::GetOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
Aura except = nullptr 
) const
4761{
4762 AuraMapBounds range = m_ownedAuras.equal_range(spellId);
4763 for (AuraMap::const_iterator itr = range.first; itr != range.second; ++itr)
4764 {
4765 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask)
4766 && (!casterGUID || itr->second->GetCasterGUID() == casterGUID)
4767 && (!itemCasterGUID || itr->second->GetCastItemGUID() == itemCasterGUID)
4768 && (!except || except != itr->second))
4769 {
4770 return itr->second;
4771 }
4772 }
4773 return nullptr;
4774}
std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
Definition: Unit.h:636

References m_ownedAuras.

Referenced by _TryStackingOrRefreshingExistingAura().

◆ GetOwnedAuras() [1/2]

◆ GetOwnedAuras() [2/2]

AuraMap const & Unit::GetOwnedAuras ( ) const
inline
1295{ return m_ownedAuras; }

References m_ownedAuras.

◆ GetOwner()

Unit * Unit::GetOwner ( ) const
Todo:
: move this in Object class or move GetUInt32value here but keep consistency
10601{
10602 if (ObjectGuid ownerGUID = GetOwnerGUID())
10603 return ObjectAccessor::GetUnit(*this, ownerGUID);
10604
10605 return nullptr;
10606}

References GetOwnerGUID(), and ObjectAccessor::GetUnit().

Referenced by _ExitVehicle(), Acore::AnyAoETargetUnitInObjectRangeCheck::AnyAoETargetUnitInObjectRangeCheck(), ApplyDiminishingToDuration(), ApplyResilience(), TotemAI::AttackStart(), spell_dk_anti_magic_zone::CalculateAmount(), Creature::CanStartAttack(), spell_dk_blood_gorged::CheckProc(), spell_pri_mana_leech::CheckProc(), ClearInPetCombat(), CombatStart(), CombatStartOnCast(), DealHeal(), HostileRefMgr::deleteReferences(), npc_spring_rabbit::npc_spring_rabbitAI::DoAction(), Spell::DoAllEffectOnLaunchTarget(), Spell::DoAllEffectOnTarget(), PetAI::DoAttack(), Spell::EffectDispel(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), boss_illidari_council_memberAI::EnterEvadeMode(), GetCharmerOrOwner(), GetCombatRatingReduction(), GetNextRandomRaidMemberOrPet(), GetReactionTo(), GetSpellModOwner(), spell_warl_seduction::HandleAuraApply(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_sha_healing_stream_totem::HandleDummy(), spell_q12277_wintergarde_mine_explosion::HandleDummy(), spell_sha_mana_tide_totem::HandleDummy(), HandleDummyAuraProc(), spell_mount_check_aura::HandleEffectPeriodic(), spell_gen_gryphon_wyvern_mount_check::HandleEffectPeriodic(), spell_ioc_bomb_blast_criteria::HandleGameObjectDamage(), modify_commandscript::HandleModifyTalentCommand(), WorldSession::HandlePetActionHelper(), spell_warl_demonic_pact_aura::HandleProc(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::InitializeAI(), npc_pet_dk_dancing_rune_weapon::npc_pet_dk_dancing_rune_weaponAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), IsAlwaysVisibleFor(), IsPetAura(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), npc_webbed_creature::npc_webbed_creatureAI::JustDied(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::JustDied(), Kill(), MagicSpellHitResult(), MeleeDamageBonusDone(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), npc_khunok_the_behemoth::npc_khunok_the_behemothAI::MoveInLineOfSight(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), npc_pet_mage_mirror_image::MySelectNextTarget(), npc_ancestral_wolf::npc_ancestral_wolfAI::npc_ancestral_wolfAI(), npc_pet_gen_soul_trader_beacon::npc_pet_gen_soul_trader_beacon(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_hun_aspect_of_the_beast::OnPetApply(), Acore::MostHPMissingGroupInRange::operator()(), PetSpellFail(), RemoveFromWorld(), npc_target_dummy::npc_target_dummyAI::Reset(), npc_spring_rabbit::npc_spring_rabbitAI::Reset(), RestoreFaction(), Creature::SelectVictim(), SendPetActionFeedback(), SendPetAIReaction(), SendPetTalk(), SetHealth(), SetMaxHealth(), SetMaxPower(), SetPower(), setPowerType(), SetStunned(), SpellDamageBonusDone(), SpellHealingBonusDone(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and UpdateAuraForGroup().

◆ GetOwnerGUID()

ObjectGuid Unit::GetOwnerGUID ( ) const
inline
@ UNIT_FIELD_SUMMONEDBY
Definition: UpdateFields.h:90

References Object::GetGuidValue(), and UNIT_FIELD_SUMMONEDBY.

Referenced by Pet::AddToWorld(), npc_living_mojo::npc_living_mojoAI::AttackStart(), BuildValuesUpdate(), PetAI::CanAttack(), CanFreeMove(), CanHaveThreatList(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), DealDamage(), Spell::DoAllEffectOnTarget(), FollowMovementGenerator< T >::DoUpdate(), GetCharmerOrOwnerGUID(), GetOwner(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModInvisibilityDetect(), AuraEffect::HandleModStealth(), AuraEffect::HandleModStealthDetect(), AuraEffect::HandleModStealthLevel(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetRename(), HandleSpellClick(), Creature::HasMechanicTemplateImmunity(), Creature::IsDungeonBoss(), Creature::IsImmuneToKnockback(), isInAccessiblePlaceFor(), Kill(), Creature::LoadSpellTemplateImmunity(), Condition::Meets(), instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npc_venomhide_hatchling::OnGossipHello(), Acore::MostHPMissingGroupInRange::operator()(), PlayerOrPetCheck::operator()(), OutDebugInfo(), PetAI::ReceiveEmote(), Creature::Regenerate(), RemoveAllControlled(), RemoveEvadeAuras(), Pet::SavePetToDB(), SetMinion(), SetOwnerGUID(), SpellPctDamageModsDone(), Map::SummonCreature(), NPCStaveQuestAI::UnitIsUnfair(), Creature::Update(), and npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::UpdateAI().

◆ GetPartyMembers()

void Unit::GetPartyMembers ( std::list< Unit * > &  units)
18821{
18822 Unit* owner = GetCharmerOrOwnerOrSelf();
18823 Group* group = nullptr;
18824 if (owner->IsPlayer())
18825 group = owner->ToPlayer()->GetGroup();
18826
18827 if (group)
18828 {
18829 uint8 subgroup = owner->ToPlayer()->GetSubGroup();
18830
18831 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
18832 {
18833 Player* Target = itr->GetSource();
18834
18835 // IsHostileTo check duel and controlled by enemy
18836 if (Target && Target->IsInMap(owner) && Target->GetSubGroup() == subgroup && !IsHostileTo(Target))
18837 {
18838 if (Target->IsAlive())
18839 TagUnitMap.push_back(Target);
18840
18841 for (Unit::ControlSet::iterator iterator = Target->m_Controlled.begin(); iterator != Target->m_Controlled.end(); ++iterator)
18842 {
18843 if (Unit* pet = *iterator)
18844 if (pet->IsGuardian() && pet->IsAlive())
18845 TagUnitMap.push_back(pet);
18846 }
18847 }
18848 }
18849 }
18850 else
18851 {
18852 if (owner->IsAlive())
18853 TagUnitMap.push_back(owner);
18854
18855 for (Unit::ControlSet::iterator itr = owner->m_Controlled.begin(); itr != owner->m_Controlled.end(); ++itr)
18856 {
18857 if (Unit* pet = *itr)
18858 if (pet->IsGuardian() && pet->IsAlive())
18859 TagUnitMap.push_back(pet);
18860 }
18861 }
18862}
uint8 GetSubGroup() const
Definition: Player.h:2455

References GetCharmerOrOwnerOrSelf(), Group::GetFirstMember(), Player::GetGroup(), Player::GetSubGroup(), IsAlive(), IsHostileTo(), WorldObject::IsInMap(), Object::IsPlayer(), m_Controlled, GroupReference::next(), and Object::ToPlayer().

Referenced by spell_warr_improved_spell_reflection_trigger_aura::HandleRemove().

◆ GetPetGUID()

◆ GetPhaseByAuras()

uint32 Unit::GetPhaseByAuras ( ) const
19040{
19041 uint32 currentPhase = 0;
19043 if (!phases.empty())
19044 for (AuraEffectList::const_iterator itr = phases.begin(); itr != phases.end(); ++itr)
19045 currentPhase |= (*itr)->GetMiscValue();
19046
19047 return currentPhase;
19048}
@ SPELL_AURA_PHASE
Definition: SpellAuraDefines.h:324

References GetAuraEffectsByType(), and SPELL_AURA_PHASE.

Referenced by Player::GetPhaseMaskForSpawn(), AuraEffect::HandlePhase(), and Player::SetGameMaster().

◆ GetPosStat()

float Unit::GetPosStat ( Stats  stat) const
inline
1003{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_POSSTAT0.

◆ GetPower()

uint32 Unit::GetPower ( Powers  power) const
inline
1056{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power); }
@ UNIT_FIELD_POWER1
Definition: UpdateFields.h:97

References Object::GetUInt32Value(), and UNIT_FIELD_POWER1.

Referenced by PetAI::_canMeleeAttack(), Player::_SaveCharacter(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), spell_igb_cannon_blast::CalculatePower(), Creature::CanCastSpell(), Spell::CheckItems(), Spell::CheckPower(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), Spell::EffectCastButtons(), Spell::EffectWeaponDmg(), Pet::FillPetInfo(), Pet::GetHappinessState(), GetPowerPct(), Player::GiveLevel(), AuraEffect::HandleAuraModShapeshift(), spell_warr_execute::HandleEffect(), AuraEffect::HandleObsModPowerAuraTick(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldSession::HandlePetAbandon(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_pal_lay_on_hands::HandleScript(), Player::InitStatsForLevel(), npc_obsidian_destroyer::JustEngagedWith(), spell_gen_replenishment_aura::Load(), Pet::LoseHappiness(), ModifyPower(), spell_mark_of_kazrogal_aura::OnPeriodic(), spell_mark_of_kazzak_aura::OnPeriodic(), Acore::PowerPctOrderPred::operator()(), SmartScript::ProcessAction(), Creature::reachWithSpellAttack(), Creature::reachWithSpellCure(), Creature::Regenerate(), Player::Regenerate(), Creature::RegenerateHealth(), Player::SaveManaBeforeDuel(), Pet::SavePetToDB(), Creature::SaveToDB(), ScriptedAI::SelectSpell(), Spell::SendSpellGo(), Spell::SendSpellStart(), SetMaxPower(), SetPower(), setPowerType(), spell_igb_incinerating_blast::StoreEnergy(), Aura::Update(), boss_moam::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), PetAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ GetPowerPct()

float Unit::GetPowerPct ( Powers  power) const
inline
1058{ return GetMaxPower(power) ? 100.f * GetPower(power) / GetMaxPower(power) : 0.0f; }
uint32 GetMaxPower(Powers power) const
Definition: Unit.h:1057
uint32 GetPower(Powers power) const
Definition: Unit.h:1056

References GetMaxPower(), and GetPower().

Referenced by npc_obsidian_destroyer::JustEngagedWith(), npc_obsidian_eradicator::JustEngagedWith(), npc_obsidian_nullifier::JustEngagedWith(), boss_curator::JustEngagedWith(), SmartScript::ProcessAction(), SmartScript::ProcessEvent(), and boss_hazzarah::UpdateAI().

◆ getPowerType()

◆ GetPowerTypeByAuraGroup()

Powers Unit::GetPowerTypeByAuraGroup ( UnitMods  unitMod) const
15407{
15408 switch (unitMod)
15409 {
15410 case UNIT_MOD_RAGE:
15411 return POWER_RAGE;
15412 case UNIT_MOD_FOCUS:
15413 return POWER_FOCUS;
15414 case UNIT_MOD_ENERGY:
15415 return POWER_ENERGY;
15416 case UNIT_MOD_HAPPINESS:
15417 return POWER_HAPPINESS;
15418 case UNIT_MOD_RUNE:
15419 return POWER_RUNE;
15421 return POWER_RUNIC_POWER;
15422 default:
15423 case UNIT_MOD_MANA:
15424 return POWER_MANA;
15425 }
15426}
@ UNIT_MOD_RUNE
Definition: Unit.h:154
@ UNIT_MOD_ENERGY
Definition: Unit.h:152
@ UNIT_MOD_FOCUS
Definition: Unit.h:151
@ UNIT_MOD_HAPPINESS
Definition: Unit.h:153
@ UNIT_MOD_MANA
Definition: Unit.h:149
@ UNIT_MOD_RAGE
Definition: Unit.h:150
@ UNIT_MOD_RUNIC_POWER
Definition: Unit.h:155

References POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNE, POWER_RUNIC_POWER, UNIT_MOD_ENERGY, UNIT_MOD_FOCUS, UNIT_MOD_HAPPINESS, UNIT_MOD_MANA, UNIT_MOD_RAGE, UNIT_MOD_RUNE, and UNIT_MOD_RUNIC_POWER.

Referenced by HandleStatModifier().

◆ GetPPMProcChance()

float Unit::GetPPMProcChance ( uint32  WeaponSpeed,
float  PPM,
SpellInfo const *  spellProto 
) const
13452{
13453 // proc per minute chance calculation
13454 if (PPM <= 0)
13455 return 0.0f;
13456
13457 // Apply chance modifer aura
13458 if (spellProto)
13459 if (Player* modOwner = GetSpellModOwner())
13460 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_PROC_PER_MINUTE, PPM);
13461
13462 return std::floor((WeaponSpeed * PPM) / 600.0f); // result is chance in percents (probability = Speed_in_sec * (PPM / 60))
13463}
@ SPELLMOD_PROC_PER_MINUTE
Definition: SpellDefines.h:102

References GetSpellModOwner(), SpellInfo::Id, and SPELLMOD_PROC_PER_MINUTE.

Referenced by Player::CastItemCombatSpell(), and IsTriggeredAtSpellProcEvent().

◆ GetProcAurasTriggeredOnEvent()

void Unit::GetProcAurasTriggeredOnEvent ( std::list< AuraApplication * > &  aurasTriggeringProc,
std::list< AuraApplication * > *  procAuras,
ProcEventInfo  eventInfo 
)
16515{
16516 // use provided list of auras which can proc
16517 if (procAuras)
16518 {
16519 for (std::list<AuraApplication*>::iterator itr = procAuras->begin(); itr != procAuras->end(); ++itr)
16520 {
16521 ASSERT((*itr)->GetTarget() == this);
16522 if (!(*itr)->GetRemoveMode())
16523 if ((*itr)->GetBase()->IsProcTriggeredOnEvent(*itr, eventInfo))
16524 {
16525 (*itr)->GetBase()->PrepareProcToTrigger(*itr, eventInfo);
16526 aurasTriggeringProc.push_back(*itr);
16527 }
16528 }
16529 }
16530 // or generate one on our own
16531 else
16532 {
16533 for (AuraApplicationMap::iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16534 {
16535 if (itr->second->GetBase()->IsProcTriggeredOnEvent(itr->second, eventInfo))
16536 {
16537 itr->second->GetBase()->PrepareProcToTrigger(itr->second, eventInfo);
16538 aurasTriggeringProc.push_back(itr->second);
16539 }
16540 }
16541 }
16542}

References ASSERT, and GetAppliedAuras().

Referenced by TriggerAurasProcOnEvent().

◆ getRace()

uint8 Unit::getRace ( bool  original = false) const
21008{
21009 if (IsPlayer())
21010 {
21011 if (original)
21012 return m_realRace;
21013 else
21014 return m_race;
21015 }
21016
21018}

References Object::GetByteValue(), Object::IsPlayer(), m_race, m_realRace, and UNIT_FIELD_BYTES_0.

Referenced by Player::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), Player::BuildPlayerRepop(), Corpse::BuildValuesUpdate(), Player::CreateCorpse(), GetModelForForm(), GetModelForTotem(), getRaceMask(), GetReactionTo(), Player::GetStartPosition(), Player::GetTeamId(), Player::GiveLevel(), WorldSession::HandleAlterAppearance(), AuraEffect::HandleAuraTransform(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), reset_commandscript::HandleResetStatsOrLevelHelper(), Player::InitDisplayIds(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Creature::IsValidTrainerForPlayer(), Channel::KickOrBan(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), Player::LoadFromDB(), AchievementCriteriaData::Meets(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnPlayerEnter(), RestoreFaction(), Player::RewardHonor(), WorldSession::SendNameQueryOpcode(), Player::SetGameMaster(), Player::StoreNewItemInBestSlots(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSkillsForLevel().

◆ getRaceMask()

◆ GetRandomContactPoint()

bool Unit::GetRandomContactPoint ( Unit const *  target,
float &  x,
float &  y,
float &  z,
bool  force = false 
) const
701{
702 float combat_reach = GetCombatReach();
703 if (combat_reach < 0.1f) // sometimes bugged for players
704 combat_reach = DEFAULT_COMBAT_REACH;
705
706 uint32 attacker_number = getAttackers().size();
707 if (attacker_number > 0)
708 --attacker_number;
709 Creature const* c = obj->ToCreature();
710 if (c)
711 if (c->isWorldBoss() || c->IsDungeonBoss() || (obj->IsPet() && const_cast<Unit*>(obj)->ToPet()->isControlled()))
712 attacker_number = 0; // pussywizard: pets and bosses just come to target from their angle
713
714 GetNearPoint(obj, x, y, z, isMoving() ? (obj->GetCombatReach() > 7.75f ? obj->GetCombatReach() - 7.5f : 0.25f) : obj->GetCombatReach(), 0.0f,
715 GetAngle(obj) + (attacker_number ? (static_cast<float>(M_PI / 2) - static_cast<float>(M_PI) * (float)rand_norm()) * float(attacker_number) / combat_reach * 0.3f : 0));
716
717 // pussywizard
718 if (std::fabs(this->GetPositionZ() - z) > this->GetCollisionHeight() || !IsWithinLOS(x, y, z))
719 {
720 x = this->GetPositionX();
721 y = this->GetPositionY();
722 z = this->GetPositionZ();
723 obj->UpdateAllowedPositionZ(x, y, z);
724 }
725 float maxDist = GetMeleeRange(obj);
726 if (GetExactDistSq(x, y, z) >= maxDist * maxDist)
727 {
728 if (force)
729 {
730 x = this->GetPositionX();
731 y = this->GetPositionY();
732 z = this->GetPositionZ();
733 return true;
734 }
735 return false;
736 }
737 return true;
738}
#define DEFAULT_COMBAT_REACH
Definition: ObjectDefines.h:46
bool IsDungeonBoss() const
Definition: Creature.cpp:3162
bool IsWithinLOS(float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
Definition: Object.cpp:1326
float GetExactDistSq(float x, float y, float z) const
Definition: Position.h:169
bool isControlled() const
Definition: Pet.h:54
float GetCollisionHeight() const override
Return collision height sent to client.
Definition: Unit.cpp:21107
float GetMeleeRange(Unit const *target) const
Definition: Unit.cpp:679

References DEFAULT_COMBAT_REACH, Position::GetAngle(), getAttackers(), GetCollisionHeight(), GetCombatReach(), Position::GetExactDistSq(), GetMeleeRange(), WorldObject::GetNearPoint(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Pet::isControlled(), Creature::IsDungeonBoss(), isMoving(), IsPet(), WorldObject::IsWithinLOS(), Creature::isWorldBoss(), rand_norm(), Object::ToCreature(), ToPet(), and WorldObject::UpdateAllowedPositionZ().

Referenced by boss_bug_trio::DamageTaken(), and boss_bug_trio::DoFinalSpell().

◆ GetRangedCritChanceReduction()

float Unit::GetRangedCritChanceReduction ( ) const
inline

◆ GetRangedCritDamageReduction()

uint32 Unit::GetRangedCritDamageReduction ( uint32  damage) const
inline

◆ GetRangedDamageReduction()

uint32 Unit::GetRangedDamageReduction ( uint32  damage) const
inline

◆ GetReactionTo()

ReputationRank Unit::GetReactionTo ( Unit const *  target,
bool  checkOriginalFaction = false 
) const
10065{
10066 // always friendly to self
10067 if (this == target)
10068 return REP_FRIENDLY;
10069
10070 // always friendly to charmer or owner
10072 return REP_FRIENDLY;
10073
10074 Player const* selfPlayerOwner = GetAffectingPlayer();
10075 Player const* targetPlayerOwner = target->GetAffectingPlayer();
10076
10077 // check forced reputation to support SPELL_AURA_FORCE_REACTION
10078 if (selfPlayerOwner)
10079 {
10080 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10081 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10082 return *repRank;
10083 }
10084 else if (targetPlayerOwner)
10085 {
10086 if (FactionTemplateEntry const* selfFactionTemplateEntry = GetFactionTemplateEntry())
10087 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(selfFactionTemplateEntry))
10088 return *repRank;
10089 }
10090
10092 {
10093 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
10094 {
10095 if (selfPlayerOwner && targetPlayerOwner)
10096 {
10097 // always friendly to other unit controlled by player, or to the player himself
10098 if (selfPlayerOwner == targetPlayerOwner)
10099 return REP_FRIENDLY;
10100
10101 // duel - always hostile to opponent
10102 if (selfPlayerOwner->duel && selfPlayerOwner->duel->Opponent == targetPlayerOwner && selfPlayerOwner->duel->State == DUEL_STATE_IN_PROGRESS)
10103 return REP_HOSTILE;
10104
10105 // same group - checks dependant only on our faction - skip FFA_PVP for example
10106 if (selfPlayerOwner->IsInRaidWith(targetPlayerOwner))
10107 return REP_FRIENDLY; // return true to allow config option AllowTwoSide.Interaction.Group to work
10108 // however client seems to allow mixed group parties, because in 13850 client it works like:
10109 // return GetFactionReactionTo(GetFactionTemplateEntry(), target);
10110 }
10111
10112 // check FFA_PVP
10113 if (IsFFAPvP() && target->IsFFAPvP())
10114 return REP_HOSTILE;
10115
10116 if (selfPlayerOwner)
10117 {
10118 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10119 {
10120 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10121 return *repRank;
10122 if (!selfPlayerOwner->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10123 {
10124 if (FactionEntry const* targetFactionEntry = sFactionStore.LookupEntry(targetFactionTemplateEntry->faction))
10125 {
10126 if (targetFactionEntry->CanHaveReputation())
10127 {
10128 // check contested flags
10129 if (targetFactionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10130 && selfPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10131 return REP_HOSTILE;
10132
10133 // if faction has reputation, hostile state depends only from AtWar state
10134 if (selfPlayerOwner->GetReputationMgr().IsAtWar(targetFactionEntry))
10135 return REP_HOSTILE;
10136 return REP_FRIENDLY;
10137 }
10138 }
10139 }
10140 }
10141 }
10142 }
10143 }
10144
10145 ReputationRank repRank = REP_HATED;
10146 if (!sScriptMgr->IfNormalReaction(this, target, repRank))
10147 {
10148 return ReputationRank(repRank);
10149 }
10150
10151 FactionTemplateEntry const* factionTemplateEntry = nullptr;
10152 if (checkOriginalFaction)
10153 {
10154 if (IsPlayer())
10155 {
10156 if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(getRace()))
10157 {
10158 factionTemplateEntry = sFactionTemplateStore.LookupEntry(rEntry->FactionID);
10159 }
10160 }
10161 else
10162 {
10163 Unit* owner = GetOwner();
10164 if (HasUnitTypeMask(UNIT_MASK_MINION) && owner)
10165 {
10166 factionTemplateEntry = sFactionTemplateStore.LookupEntry(owner->GetFaction());
10167 }
10168 else if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate())
10169 {
10170 factionTemplateEntry = sFactionTemplateStore.LookupEntry(cinfo->faction);
10171 }
10172 }
10173 }
10174
10175 if (!factionTemplateEntry)
10176 {
10177 factionTemplateEntry = GetFactionTemplateEntry();
10178 }
10179
10180 // do checks dependant only on our faction
10181 return GetFactionReactionTo(factionTemplateEntry, target);
10182}
@ REP_HATED
Definition: SharedDefines.h:180
DBCStorage< ChrRacesEntry > sChrRacesStore(ChrRacesEntryfmt)
bool HasPlayerFlag(PlayerFlags flags) const
Definition: Player.h:1108
ReputationRank GetFactionReactionTo(FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
Definition: Unit.cpp:10184
bool IsInRaidWith(Unit const *unit) const
Definition: Unit.cpp:18798
bool IsAtWar(uint32 faction_id) const
Definition: ReputationMgr.cpp:55
Definition: DBCStructure.h:678

References Player::duel, DUEL_STATE_IN_PROGRESS, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, GetAffectingPlayer(), GetCharmerOrOwnerOrSelf(), GetFaction(), GetFactionReactionTo(), GetFactionTemplateEntry(), ReputationMgr::GetForcedRankIfAny(), GetOwner(), getRace(), Player::GetReputationMgr(), Player::HasPlayerFlag(), HasUnitFlag(), HasUnitFlag2(), HasUnitTypeMask(), ReputationMgr::IsAtWar(), IsFFAPvP(), IsInRaidWith(), Object::IsPlayer(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HATED, REP_HOSTILE, sChrRacesStore, sFactionStore, sFactionTemplateStore, sScriptMgr, Object::ToCreature(), UNIT_FLAG2_IGNORE_REPUTATION, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_MINION.

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), GetDispellableAuraList(), Player::GetNPCIfCanInteractWith(), IsFriendlyTo(), IsHostileTo(), and Condition::Meets().

◆ GetRedirectThreatPercent()

uint32 Unit::GetRedirectThreatPercent ( )
inline
uint32 GetThreatPct() const
Definition: ThreatMgr.h:299

References _redirectThreatInfo, and RedirectThreatInfo::GetThreatPct().

Referenced by ThreatMgr::DoAddThreat().

◆ GetRedirectThreatTarget()

Unit * Unit::GetRedirectThreatTarget ( ) const

◆ GetResistance() [1/2]

uint32 Unit::GetResistance ( SpellSchoolMask  mask) const
20335{
20336 int32 resist = -1;
20337 for (int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)
20338 if (mask & (1 << i) && (resist < 0 || resist > int32(GetResistance(SpellSchools(i)))))
20339 resist = int32(GetResistance(SpellSchools(i)));
20340
20341 // resist value will never be negative here
20342 return uint32(resist);
20343}

References GetResistance(), MAX_SPELL_SCHOOL, and SPELL_SCHOOL_NORMAL.

Referenced by Player::_SaveStats(), GetArmor(), GetEffectiveResistChance(), GetResistance(), and Player::outDebugValues().

◆ GetResistance() [2/2]

uint32 Unit::GetResistance ( SpellSchools  school) const
inline
1119{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_RESISTANCES) + school); }
@ UNIT_FIELD_RESISTANCES
Definition: UpdateFields.h:156

References Object::GetUInt32Value(), and UNIT_FIELD_RESISTANCES.

◆ GetResistanceBuffMods()

float Unit::GetResistanceBuffMods ( SpellSchools  school,
bool  positive 
) const
inline

◆ GetShapeshiftForm()

◆ GetSharedVisionList()

◆ GetSheath()

SheathState Unit::GetSheath ( ) const
inline
SheathState
Definition: UnitDefines.h:104

References Object::GetByteValue(), and UNIT_FIELD_BYTES_2.

◆ GetShieldBlockValue() [1/2]

virtual uint32 Unit::GetShieldBlockValue ( ) const
pure virtual

◆ GetShieldBlockValue() [2/2]

uint32 Unit::GetShieldBlockValue ( uint32  soft_cap,
uint32  hard_cap 
) const
inline
1098 {
1099 uint32 value = GetShieldBlockValue();
1100 if (value >= hard_cap)
1101 {
1102 value = (soft_cap + hard_cap) / 2;
1103 }
1104 else if (value > soft_cap)
1105 {
1106 value = soft_cap + ((value - soft_cap) / 2);
1107 }
1108
1109 return value;
1110 }

References GetShieldBlockValue().

◆ GetSingleCastAuras() [1/2]

AuraList & Unit::GetSingleCastAuras ( )
inline

◆ GetSingleCastAuras() [2/2]

AuraList const & Unit::GetSingleCastAuras ( ) const
inline
1351{ return m_scAuras; }

References m_scAuras.

◆ GetSpeed()

float Unit::GetSpeed ( UnitMoveType  mtype) const

◆ GetSpeedRate()

◆ GetSpellCritChanceReduction()

float Unit::GetSpellCritChanceReduction ( ) const
inline

◆ GetSpellCritDamageReduction()

◆ GetSpellDamageReduction()

uint32 Unit::GetSpellDamageReduction ( uint32  damage) const
inline

◆ GetSpellMaxRangeForTarget()

float Unit::GetSpellMaxRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15148{
15149 if (!spellInfo->RangeEntry)
15150 {
15151 return 0;
15152 }
15153
15154 if (spellInfo->RangeEntry->RangeMax[1] == spellInfo->RangeEntry->RangeMax[0])
15155 {
15156 return spellInfo->GetMaxRange();
15157 }
15158
15159 if (!target)
15160 {
15161 return spellInfo->GetMaxRange(true);
15162 }
15163
15164 return spellInfo->GetMaxRange(!IsHostileTo(target));
15165}

References SpellInfo::GetMaxRange(), IsHostileTo(), SpellInfo::RangeEntry, and SpellRangeEntry::RangeMax.

Referenced by spell_sha_fire_nova::CheckFireTotem(), Spell::CheckRange(), SpellTargetSelector::operator()(), SmartScript::ProcessAction(), ScriptedAI::SelectSpell(), GameObject::TriggeringLinkedGameObject(), and Pet::Update().

◆ GetSpellMinRangeForTarget()

float Unit::GetSpellMinRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15168{
15169 if (!spellInfo->RangeEntry)
15170 {
15171 return 0;
15172 }
15173
15174 if (spellInfo->RangeEntry->RangeMin[1] == spellInfo->RangeEntry->RangeMin[0])
15175 {
15176 return spellInfo->GetMinRange();
15177 }
15178
15179 return spellInfo->GetMinRange(!IsHostileTo(target));
15180}

References SpellInfo::GetMinRange(), IsHostileTo(), SpellInfo::RangeEntry, and SpellRangeEntry::RangeMin.

Referenced by Spell::CheckRange(), SpellTargetSelector::operator()(), SmartScript::ProcessAction(), and ScriptedAI::SelectSpell().

◆ GetSpellModOwner()

Player * Unit::GetSpellModOwner ( ) const
16579{
16580 if (Player* player = const_cast<Unit*>(this)->ToPlayer())
16581 {
16582 return player;
16583 }
16584
16585 if (Unit* owner = GetOwner())
16586 {
16587 if (Player* player = owner->ToPlayer())
16588 {
16589 return player;
16590 }
16591 }
16592
16593 // Special handling for Eye of Kilrogg
16595 {
16596 if (TempSummon const* tempSummon = ToTempSummon())
16597 {
16598 if (Unit* summoner = tempSummon->GetSummonerUnit())
16599 {
16600 return summoner->ToPlayer();
16601 }
16602 }
16603 }
16604
16605 return nullptr;
16606}
@ NPC_EYE_OF_KILROGG
Definition: PetDefines.h:101
Definition: TemporarySummon.h:40

References Object::GetEntry(), GetOwner(), NPC_EYE_OF_KILROGG, Object::ToPlayer(), and ToTempSummon().

Referenced by Spell::_cast(), Creature::AddSpellCooldown(), ApplyEffectModifiers(), CalcArmorReducedDamage(), SpellEffectInfo::CalcDamageMultiplier(), Aura::CalcDispelChance(), Aura::CalcMaxCharges(), Aura::CalcMaxDuration(), AuraEffect::CalcPeriodicCritChance(), SpellInfo::CalcPowerCost(), Aura::CalcProcChance(), SpellEffectInfo::CalcRadius(), ThreatCalcHelper::calcThreat(), spell_dru_brambles_treant::CalculateAmount(), AuraEffect::CalculatePeriodic(), CalculateSpellDamageTaken(), SpellEffectInfo::CalcValueMultiplier(), Spell::cancel(), Spell::cast(), Spell::CheckRange(), Spell::CheckRuneCost(), Spell::EffectSummonPet(), Spell::EffectSummonType(), Spell::finish(), GetEffectiveResistChance(), SpellInfo::GetMaxRange(), GetPPMProcChance(), Spell::handle_delayed(), Spell::handle_immediate(), IsAlwaysDetectableFor(), SpellInfo::IsStrongerAuraActive(), IsTriggeredAtSpellProcEvent(), MagicSpellHitResult(), MeleeDamageBonusDone(), MeleeSpellMissChance(), ModSpellCastTime(), Spell::SelectImplicitChainTargets(), Aura::SetDuration(), SpellCriticalDamageBonus(), SpellCriticalHealingBonus(), SpellDamageBonusDone(), SpellDoneCritChance(), SpellHealingBonusDone(), Spell::SummonGuardian(), Spell::TakePower(), Spell::TakeRunePower(), Spell::UpdateChanneledTargetList(), and Aura::UpdateOwner().

◆ GetSpellSchoolByAuraGroup()

SpellSchools Unit::GetSpellSchoolByAuraGroup ( UnitMods  unitMod) const
15346{
15348
15349 switch (unitMod)
15350 {
15352 school = SPELL_SCHOOL_HOLY;
15353 break;
15355 school = SPELL_SCHOOL_FIRE;
15356 break;
15358 school = SPELL_SCHOOL_NATURE;
15359 break;
15361 school = SPELL_SCHOOL_FROST;
15362 break;
15364 school = SPELL_SCHOOL_SHADOW;
15365 break;
15367 school = SPELL_SCHOOL_ARCANE;
15368 break;
15369
15370 default:
15371 break;
15372 }
15373
15374 return school;
15375}
@ SPELL_SCHOOL_SHADOW
Definition: SharedDefines.h:288
@ SPELL_SCHOOL_NATURE
Definition: SharedDefines.h:286
@ SPELL_SCHOOL_FROST
Definition: SharedDefines.h:287
@ SPELL_SCHOOL_ARCANE
Definition: SharedDefines.h:289
@ SPELL_SCHOOL_FIRE
Definition: SharedDefines.h:285
@ SPELL_SCHOOL_HOLY
Definition: SharedDefines.h:284
@ UNIT_MOD_RESISTANCE_SHADOW
Definition: Unit.h:161
@ UNIT_MOD_RESISTANCE_FROST
Definition: Unit.h:160
@ UNIT_MOD_RESISTANCE_HOLY
Definition: Unit.h:157
@ UNIT_MOD_RESISTANCE_ARCANE
Definition: Unit.h:162
@ UNIT_MOD_RESISTANCE_FIRE
Definition: Unit.h:158
@ UNIT_MOD_RESISTANCE_NATURE
Definition: Unit.h:159

References SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_NORMAL, SPELL_SCHOOL_SHADOW, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, and UNIT_MOD_RESISTANCE_SHADOW.

Referenced by HandleStatModifier().

◆ getStandState()

◆ GetStat()

◆ GetStatByAuraGroup()

Stats Unit::GetStatByAuraGroup ( UnitMods  unitMod) const
15378{
15379 Stats stat = STAT_STRENGTH;
15380
15381 switch (unitMod)
15382 {
15384 stat = STAT_STRENGTH;
15385 break;
15387 stat = STAT_AGILITY;
15388 break;
15390 stat = STAT_STAMINA;
15391 break;
15393 stat = STAT_INTELLECT;
15394 break;
15396 stat = STAT_SPIRIT;
15397 break;
15398
15399 default:
15400 break;
15401 }
15402
15403 return stat;
15404}
Stats
Definition: SharedDefines.h:257
@ STAT_SPIRIT
Definition: SharedDefines.h:262
@ STAT_INTELLECT
Definition: SharedDefines.h:261
@ STAT_AGILITY
Definition: SharedDefines.h:259
@ STAT_STRENGTH
Definition: SharedDefines.h:258
@ STAT_STAMINA
Definition: SharedDefines.h:260
@ UNIT_MOD_STAT_INTELLECT
Definition: Unit.h:146
@ UNIT_MOD_STAT_SPIRIT
Definition: Unit.h:147
@ UNIT_MOD_STAT_STRENGTH
Definition: Unit.h:143
@ UNIT_MOD_STAT_AGILITY
Definition: Unit.h:144
@ UNIT_MOD_STAT_STAMINA
Definition: Unit.h:145

References STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, and UNIT_MOD_STAT_STRENGTH.

Referenced by HandleStatModifier().

◆ GetTarget()

◆ GetThreatMgr() [1/2]

ThreatMgr & Unit::GetThreatMgr ( )
inline
903{ return m_ThreatMgr; }

References m_ThreatMgr.

Referenced by CreatureAI::_EnterEvadeMode(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_razorgore::boss_razorgoreAI::CanAIAttack(), boss_hazzarah::CanAIAttack(), boss_jindo::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_nethermancer_sepethrea::CanAIAttack(), boss_mor_grayhoof::CastRandomSpell(), CleanupBeforeRemoveFromMap(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), npc_magister_aledis::DamageTaken(), boss_ysondre::boss_ysondreAI::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), ScriptedAI::DoAddThreat(), UnitAI::DoCastToAllHostilePlayers(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoGetThreat(), ScriptedAI::DoModifyThreatByPercent(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), ScriptedAI::DoResetThreat(), ScriptedAI::DoResetThreatList(), Spell::EffectModifyThreatPercent(), Spell::EffectTaunt(), boss_faction_championsAI::EnemiesInRange(), boss_ragnaros::boss_ragnarosAI::EnterEvadeMode(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), boss_murmur::EnterEvadeMode(), boss_alar::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), boss_ouro::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), TemporaryThreatModifierEvent::Execute(), StartMovementEvent::Execute(), boss_supremus::FindHatefulStrikeTarget(), npc_raging_flames::FixateRandomTarget(), SmartScript::GetTargets(), UnitAI::GetThreatMgr(), debug_commandscript::HandleDebugThreatListCommand(), spell_karazhan_blink::HandleDummy(), spell_kaelthas_mind_control::HandleEffect(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_enveloping_webs::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), HandleProcTriggerSpell(), PetAI::HandleReturnMovement(), spell_pursue::HandleScript(), spell_gurtogg_eject::HandleScriptEffect(), spell_leotheras_whirlwind::HandleScriptEffect(), boss_attumen::IsSummonedBy(), boss_blackheart_the_inciter::JustEngagedWith(), boss_jindo::JustSummoned(), Kill(), boss_urom::boss_uromAI::LeaveCombat(), Creature::ModifyThreatPercentTemp(), boss_bug_trio::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), NonTankTargetSelector::operator()(), StoneGripTargetSelector::operator()(), boss_jeklik::PathEndReached(), SmartScript::ProcessAction(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), boss_talon_king_ikiss::Reset(), boss_faction_championsAI::SelectEnemyCaster(), npc_scholomance_occultist::npc_scholomance_occultistAI::SelectUnitCasting(), SendChangeCurrentVictimOpcode(), SendThreatListUpdate(), setDeathState(), SetPhaseMask(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::SpellHitTarget(), boss_ouro::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), BossAI::TeleportCheaters(), Creature::Update(), Update(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_nefarian::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_grilek::boss_grilekAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), boss_jindo::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_sartura::UpdateAI(), npc_sartura_royal_guard::UpdateAI(), boss_taldaram::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), boss_the_lurker_below::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), boss_netherspite::UpdatePortals(), and CreatureAI::UpdateVictim().

◆ GetThreatMgr() [2/2]

ThreatMgr const & Unit::GetThreatMgr ( ) const
inline
904{ return m_ThreatMgr; }

References m_ThreatMgr.

◆ GetTotalAttackPowerValue()

float Unit::GetTotalAttackPowerValue ( WeaponAttackType  attType,
Unit pVictim = nullptr 
) const
15429{
15430 if (attType == RANGED_ATTACK)
15431 {
15433 if (victim)
15434 ap += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
15435
15436 if (ap < 0)
15437 return 0.0f;
15439 }
15440 else
15441 {
15443 if (victim)
15444 ap += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
15445
15446 if (ap < 0)
15447 return 0.0f;
15449 }
15450}
@ SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS
Definition: SpellAuraDefines.h:190
@ SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS
Definition: SpellAuraDefines.h:228
@ UNIT_FIELD_ATTACK_POWER_MODS
Definition: UpdateFields.h:163
@ UNIT_FIELD_RANGED_ATTACK_POWER
Definition: UpdateFields.h:165
@ UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER
Definition: UpdateFields.h:167
@ UNIT_FIELD_ATTACK_POWER_MULTIPLIER
Definition: UpdateFields.h:164
@ UNIT_FIELD_ATTACK_POWER
Definition: UpdateFields.h:162
@ UNIT_FIELD_RANGED_ATTACK_POWER_MODS
Definition: UpdateFields.h:166
int32 GetInt32Value(uint16 index) const
Definition: Object.cpp:299

References Object::GetFloatValue(), Object::GetInt32Value(), GetTotalAuraModifier(), RANGED_ATTACK, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, UNIT_FIELD_ATTACK_POWER, UNIT_FIELD_ATTACK_POWER_MODS, UNIT_FIELD_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_RANGED_ATTACK_POWER, UNIT_FIELD_RANGED_ATTACK_POWER_MODS, and UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER.

Referenced by spell_dk_ghoul_thrash::CalcDamage(), Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), spell_warr_execute::HandleEffect(), spell_pal_seal_of_righteousness::HandleProc(), HandleProcTriggerSpell(), Spell::HandleThreatSpells(), Guardian::InitStatsForLevel(), SpellBaseDamageBonusDone(), SpellBaseHealingBonusDone(), SpellDamageBonusDone(), SpellHealingBonusDone(), Guardian::UpdateDamagePhysical(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetTotalAuraModifier()

◆ GetTotalAuraModifierAreaExclusive()

int32 Unit::GetTotalAuraModifierAreaExclusive ( AuraType  auratype) const
5891{
5892 int32 modifier = 0;
5893 int32 areaModifier = 0;
5894
5895 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5896 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5897 {
5898 if ((*i)->GetSpellInfo()->HasAreaAuraEffect())
5899 {
5900 if (areaModifier < (*i)->GetAmount())
5901 areaModifier = (*i)->GetAmount();
5902 }
5903 else
5904 modifier += (*i)->GetAmount();
5905 }
5906
5907 return modifier + areaModifier;
5908}

References GetAuraEffectsByType().

Referenced by Player::UpdateSpellCritChance().

◆ GetTotalAuraModifierByAffectMask()

int32 Unit::GetTotalAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6067{
6068 int32 modifier = 0;
6069
6070 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6071 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6072 if ((*i)->IsAffectedOnSpell(affectedSpell))
6073 modifier += (*i)->GetAmount();
6074
6075 return modifier;
6076}

References GetAuraEffectsByType().

◆ GetTotalAuraModifierByMiscMask()

int32 Unit::GetTotalAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
5962{
5963 int32 modifier = 0;
5964
5965 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5966 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5967 {
5968 if ((*i)->GetMiscValue()& misc_mask)
5969 modifier += (*i)->GetAmount();
5970 }
5971 return modifier;
5972}

References GetAuraEffectsByType().

Referenced by CalcArmorReducedDamage(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), GetEffectiveResistChance(), MagicSpellHitResult(), SpellCriticalDamageBonus(), SpellDamageBonusDone(), SpellDoneCritChance(), and Player::UpdateSpellCritChance().

◆ GetTotalAuraModifierByMiscValue()

int32 Unit::GetTotalAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6015{
6016 int32 modifier = 0;
6017
6018 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6019 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6020 if ((*i)->GetMiscValue() == misc_value)
6021 modifier += (*i)->GetAmount();
6022
6023 return modifier;
6024}

References GetAuraEffectsByType().

Referenced by Player::CalculateReputationGain(), GetMechanicResistChance(), MeleeSpellHitResult(), ModSpellDuration(), Creature::Regenerate(), Player::Regenerate(), RollMeleeOutcomeAgainst(), and Player::UpdateManaRegen().

◆ GetTotalAuraModValue()

float Unit::GetTotalAuraModValue ( UnitMods  unitMod) const
15319{
15320 if (unitMod >= UNIT_MOD_END)
15321 {
15322 LOG_ERROR("entities.unit", "attempt to access non-existing UnitMods in GetTotalAuraModValue()!");
15323 return 0.0f;
15324 }
15325
15326 if (m_auraModifiersGroup[unitMod][TOTAL_PCT] <= 0.0f)
15327 return 0.0f;
15328
15329 float value = m_auraModifiersGroup[unitMod][BASE_VALUE];
15330 value *= m_auraModifiersGroup[unitMod][BASE_PCT];
15331 value += m_auraModifiersGroup[unitMod][TOTAL_VALUE];
15332 value *= m_auraModifiersGroup[unitMod][TOTAL_PCT];
15333
15334 return value;
15335}

References BASE_PCT, BASE_VALUE, LOG_ERROR, m_auraModifiersGroup, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_END.

Referenced by Creature::UpdateArmor(), Creature::UpdateMaxHealth(), Creature::UpdateMaxPower(), and Creature::UpdateResistances().

◆ GetTotalAuraMultiplier()

float Unit::GetTotalAuraMultiplier ( AuraType  auratype) const
5925{
5926 float multiplier = 1.0f;
5927
5928 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5929 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5930 AddPct(multiplier, (*i)->GetAmount());
5931
5932 return multiplier;
5933}

References AddPct(), and GetAuraEffectsByType().

Referenced by MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), SpellCriticalHealingBonus(), and UpdateSpeed().

◆ GetTotalAuraMultiplierByAffectMask()

float Unit::GetTotalAuraMultiplierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6079{
6080 float multiplier = 1.0f;
6081
6082 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6083 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6084 if ((*i)->IsAffectedOnSpell(affectedSpell))
6085 AddPct(multiplier, (*i)->GetAmount());
6086
6087 return multiplier;
6088}

References AddPct(), and GetAuraEffectsByType().

◆ GetTotalAuraMultiplierByMiscMask()

float Unit::GetTotalAuraMultiplierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
5975{
5976 float multiplier = 1.0f;
5977
5978 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5979 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5980 if (((*i)->GetMiscValue() & misc_mask))
5981 AddPct(multiplier, (*i)->GetAmount());
5982
5983 return multiplier;
5984}

References AddPct(), and GetAuraEffectsByType().

Referenced by CalculateAOEDamageReduction(), CalculateMeleeDamage(), MeleeDamageBonusTaken(), and SpellCriticalHealingBonus().

◆ GetTotalAuraMultiplierByMiscValue()

float Unit::GetTotalAuraMultiplierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6027{
6028 float multiplier = 1.0f;
6029
6030 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6031 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6032 if ((*i)->GetMiscValue() == misc_value)
6033 AddPct(multiplier, (*i)->GetAmount());
6034
6035 return multiplier;
6036}

References AddPct(), and GetAuraEffectsByType().

Referenced by Player::UpdateManaRegen().

◆ GetTotalStatValue()

float Unit::GetTotalStatValue ( Stats  stat,
float  additionalValue = 0.0f 
) const
15303{
15304 UnitMods unitMod = UnitMods(static_cast<uint16>(UNIT_MOD_STAT_START) + stat);
15305
15306 if (m_auraModifiersGroup[unitMod][TOTAL_PCT] <= 0.0f)
15307 return 0.0f;
15308
15309 // value = ((base_value * base_pct) + total_value) * total_pct
15310 float value = m_auraModifiersGroup[unitMod][BASE_VALUE] + GetCreateStat(stat);
15311 value *= m_auraModifiersGroup[unitMod][BASE_PCT];
15312 value += m_auraModifiersGroup[unitMod][TOTAL_VALUE] + additionalValue;
15313 value *= m_auraModifiersGroup[unitMod][TOTAL_PCT];
15314
15315 return value;
15316}
UnitMods
Definition: Unit.h:142
@ UNIT_MOD_STAT_START
Definition: Unit.h:170
float GetCreateStat(Stats stat) const
Definition: Unit.h:1000

References BASE_PCT, BASE_VALUE, GetCreateStat(), m_auraModifiersGroup, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_STAT_START.

Referenced by Player::UpdateAllStats(), Guardian::UpdateStats(), and Player::UpdateStats().

◆ getTransForm()

◆ GetTransGUID()

◆ GetUnitBlockChance()

float Unit::GetUnitBlockChance ( ) const
3703{
3704 if (Player const* player = ToPlayer())
3705 {
3706 if (player->CanBlock())
3707 {
3708 Item* tmpitem = player->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
3709 if (tmpitem && !tmpitem->IsBroken() && tmpitem->GetTemplate()->Block)
3711 }
3712 // is player but has no block ability or no not broken shield equipped
3713 return 0.0f;
3714 }
3715 else
3716 {
3717 if (ToCreature()->IsTotem())
3718 return 0.0f;
3719 else
3720 {
3721 float block = 5.0f;
3723 return block > 0.0f ? block : 0.0f;
3724 }
3725 }
3726}
@ SPELL_AURA_MOD_BLOCK_PERCENT
Definition: SpellAuraDefines.h:114
@ EQUIPMENT_SLOT_OFFHAND
Definition: Player.h:691
#define INVENTORY_SLOT_BAG_0
Definition: Player.h:670
@ PLAYER_BLOCK_PERCENTAGE
Definition: UpdateFields.h:346
ItemTemplate const * GetTemplate() const
Definition: Item.cpp:544
bool IsBroken() const
Definition: Item.h:257
uint32 Block
Definition: ItemTemplate.h:674

References ItemTemplate::Block, EQUIPMENT_SLOT_OFFHAND, Object::GetFloatValue(), Item::GetTemplate(), GetTotalAuraModifier(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), IsTotem(), PLAYER_BLOCK_PERCENTAGE, SPELL_AURA_MOD_BLOCK_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by isSpellBlocked(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitCriticalChance()

float Unit::GetUnitCriticalChance ( WeaponAttackType  attackType,
Unit const *  victim 
) const
3729{
3730 float crit;
3731
3732 if (IsPlayer())
3733 {
3734 switch (attackType)
3735 {
3736 case BASE_ATTACK:
3738 break;
3739 case OFF_ATTACK:
3741 break;
3742 case RANGED_ATTACK:
3744 break;
3745 // Just for good manner
3746 default:
3747 crit = 0.0f;
3748 break;
3749 }
3750 }
3751 else
3752 {
3753 crit = 5.0f;
3756 }
3757
3758 // flat aura mods
3759 if (attackType == RANGED_ATTACK)
3760 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE);
3761 else
3762 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE);
3763
3764 AuraEffectList const& mTotalAuraList = victim->GetAuraEffectsByType(SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER);
3765 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
3766 {
3767 if (GetGUID() != (*i)->GetCasterGUID())
3768 continue;
3769
3770 crit += (*i)->GetAmount();
3771 }
3772
3773 // reduce crit chance from Rating for players
3774 if (attackType != RANGED_ATTACK)
3775 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_MELEE);
3776 else
3777 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_RANGED);
3778
3779 // Apply crit chance from defence skill
3780 crit += (int32(GetMaxSkillValueForLevel(victim)) - int32(victim->GetDefenseSkillValue(this))) * 0.04f;
3781
3782 // xinef: SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE should be calculated at the end
3783 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE);
3784
3785 if (crit < 0.0f)
3786 crit = 0.0f;
3787 return crit;
3788}
@ SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER
Definition: SpellAuraDefines.h:371
@ SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE
Definition: SpellAuraDefines.h:251
@ SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
Definition: SpellAuraDefines.h:260
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE
Definition: SpellAuraDefines.h:250
@ SPELL_AURA_MOD_CRIT_PCT
Definition: SpellAuraDefines.h:353
@ SPELL_AURA_MOD_WEAPON_CRIT_PERCENT
Definition: SpellAuraDefines.h:115
@ PLAYER_RANGED_CRIT_PERCENTAGE
Definition: UpdateFields.h:352
@ PLAYER_CRIT_PERCENTAGE
Definition: UpdateFields.h:351
@ PLAYER_OFFHAND_CRIT_PERCENTAGE
Definition: UpdateFields.h:353
uint16 GetMaxSkillValueForLevel(Unit const *target=nullptr) const
Definition: Unit.h:1130

References ApplyResilience(), BASE_ATTACK, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, GetAuraEffectsByType(), GetDefenseSkillValue(), Object::GetFloatValue(), Object::GetGUID(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), Object::IsPlayer(), OFF_ATTACK, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, RANGED_ATTACK, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELL_AURA_MOD_CRIT_PCT, and SPELL_AURA_MOD_WEAPON_CRIT_PERCENT.

Referenced by spell_dk_wandering_plague_aura::CheckProc(), and RollMeleeOutcomeAgainst().

◆ GetUnitDodgeChance()

float Unit::GetUnitDodgeChance ( ) const
3641{
3642 if (IsPlayer())
3643 return ToPlayer()->GetRealDodge(); //GetFloatValue(PLAYER_DODGE_PERCENTAGE);
3644 else
3645 {
3646 if (ToCreature()->IsTotem())
3647 return 0.0f;
3648 else
3649 {
3650 float dodge = ToCreature()->isWorldBoss() ? 5.85f : 5.0f; // Xinef: bosses should have 6.5% dodge (5.9 + 0.6 from defense skill difference)
3652 return dodge > 0.0f ? dodge : 0.0f;
3653 }
3654 }
3655}
@ SPELL_AURA_MOD_DODGE_PERCENT
Definition: SpellAuraDefines.h:112
float GetRealDodge() const
Definition: Player.h:2591

References Player::GetRealDodge(), GetTotalAuraModifier(), Object::IsPlayer(), IsTotem(), Creature::isWorldBoss(), SPELL_AURA_MOD_DODGE_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitFlags()

◆ GetUnitFlags2()

UnitFlags2 Unit::GetUnitFlags2 ( ) const
inline

Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h.

@ UNIT_FIELD_FLAGS_2
Definition: UpdateFields.h:118
UnitFlags2
Definition: UnitDefines.h:266

References Object::GetUInt32Value(), and UNIT_FIELD_FLAGS_2.

Referenced by npc_commandscript::HandleNpcInfoCommand().

◆ GetUnitMeleeSkill()

uint32 Unit::GetUnitMeleeSkill ( Unit const *  target = nullptr) const
inline
1112{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }

References GetLevel(), and getLevelForTarget().

Referenced by DealMeleeDamage(), GetDefenseSkillValue(), and GetWeaponSkillValue().

◆ GetUnitMissChance()

float Unit::GetUnitMissChance ( WeaponAttackType  attType) const
3688{
3689 float miss_chance = 5.00f;
3690
3691 if (Player const* player = ToPlayer())
3692 miss_chance += player->GetMissPercentageFromDefence();
3693
3694 if (attType == RANGED_ATTACK)
3696 else
3698
3699 return miss_chance;
3700}
@ SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE
Definition: SpellAuraDefines.h:247
@ SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE
Definition: SpellAuraDefines.h:248

References GetTotalAuraModifier(), RANGED_ATTACK, SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE, and Object::ToPlayer().

Referenced by MeleeSpellMissChance().

◆ GetUnitMovementFlags()

◆ GetUnitParryChance()

float Unit::GetUnitParryChance ( ) const
3658{
3659 float chance = 0.0f;
3660
3661 if (Player const* player = ToPlayer())
3662 {
3663 if (player->CanParry())
3664 {
3665 Item* tmpitem = player->GetWeaponForAttack(BASE_ATTACK, true);
3666 if (!tmpitem)
3667 tmpitem = player->GetWeaponForAttack(OFF_ATTACK, true);
3668
3669 if (tmpitem)
3670 chance = player->GetRealParry(); //GetFloatValue(PLAYER_PARRY_PERCENTAGE);
3671 }
3672 }
3673 else if (IsCreature())
3674 {
3675 if (ToCreature()->isWorldBoss())
3676 chance = 13.4f; // + 0.6 by skill diff
3678 chance = 5.0f;
3679
3680 // Xinef: if aura is present, type should not matter
3682 }
3683
3684 return chance > 0.0f ? chance : 0.0f;
3685}
@ SPELL_AURA_MOD_PARRY_PERCENT
Definition: SpellAuraDefines.h:110

References BASE_ATTACK, CREATURE_TYPE_HUMANOID, GetCreatureType(), GetTotalAuraModifier(), Object::IsCreature(), OFF_ATTACK, SPELL_AURA_MOD_PARRY_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by spell_dk_spell_deflection::Absorb(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitState()

uint32 Unit::GetUnitState ( ) const
inline

◆ GetUnitTypeMask()

uint32 Unit::GetUnitTypeMask ( ) const
inline
708{ return m_unitTypeMask; }

References m_unitTypeMask.

◆ GetVehicle()

Vehicle * Unit::GetVehicle ( ) const
inline
1786{ return m_vehicle; }

References m_vehicle.

Referenced by KillRewarder::_InitXP(), Vehicle::AddPassenger(), WorldSession::BuildPartyMemberStatsChangedPacket(), boss_the_lich_king::boss_the_lich_kingAI::CanAIAttack(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::CanAIAttack(), npc_raging_spirit::npc_raging_spiritAI::CanAIAttack(), npc_icc_lk_checktarget::npc_icc_lk_checktargetAI::CanAIAttack(), boss_flame_leviathan_defense_turret::boss_flame_leviathan_defense_turretAI::CanAIAttack(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::CheckAchievementCriteriaMeet(), Spell::CheckCast(), Spell::EffectJumpDest(), Spell::EffectKnockBack(), CreatureAI::EnterEvadeMode(), GetDirectTransport(), SmartScript::GetTargets(), GetTransGUID(), WorldSession::HandleAttackSwingOpcode(), WorldSession::HandleChangeSeatsOnControlledVehicle(), spell_switch_infragreen_bomber_station::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), Player::IsPetNeedBeTemporaryUnsummoned(), npc_nexus_lord::npc_nexus_lordAI::JustDied(), npc_scion_of_eternity::npc_scion_of_eternityAI::JustDied(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), achievement_flame_leviathan_garage::OnCheck(), achievement_wg_didnt_stand_a_chance::OnCheck(), npc_announcer_toc5::OnGossipHello(), BattlefieldWG::OnPlayerLeaveWar(), boss_flame_leviathan_overload_device::boss_flame_leviathan_overload_deviceAI::OnSpellClick(), VehicleCheck::operator()(), OutDebugInfo(), Player::ProcessDelayedOperations(), Player::ProcessTerrainStatusUpdate(), Vehicle::RemovePassenger(), Creature::SelectVictim(), SetControlled(), Player::SetViewpoint(), lfg::LFGMgr::TeleportPlayer(), npc_pilgrims_bounty_chair::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_impaling_spear::npc_impaling_spearAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::UpdateAI(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::UpdateAI(), Player::UpdateAreaDependentAuras(), UpdatePosition(), UpdateSpeed(), GameObject::Use(), Acore::MessageDistDeliverer::Visit(), and Acore::MessageDistDelivererToHostile::Visit().

◆ GetVehicleBase()

◆ GetVehicleCreatureBase()

◆ GetVehicleKit()

Vehicle * Unit::GetVehicleKit ( ) const
inline
1785{ return m_vehicleKit; }

References m_vehicleKit.

Referenced by _EnterVehicle(), Creature::AddToWorld(), Creature::AIM_Initialize(), boss_xt002::boss_xt002AI::AttachHeart(), npc_salvaged_siege_engine::BeforeSpellClick(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::boss_deathbringer_saurfangAI(), spell_igb_cannon_blast::CalculatePower(), Aura::CanStackWith(), spell_demolisher_ride_vehicle::CheckCast(), SmartAI::CheckConditions(), VehicleAI::CheckConditions(), Map::CreatureRelocation(), Dismount(), npc_orb_carrier::npc_orb_carrierAI::DoAction(), npc_ulduar_vx001::npc_ulduar_vx001AI::DoAction(), npc_hover_disk::npc_hover_diskAI::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), Spell::EffectTeleportUnits(), CreatureAI::EnterEvadeMode(), boss_ick::boss_ickAI::GetKrick(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::GetS3(), SmartScript::GetTargets(), AuraEffect::HandleAuraControlVehicle(), AuraEffect::HandleAuraSetVehicle(), WorldSession::HandleCastSpellOpcode(), spell_q13280_13283_plant_battle_standard::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_q12919_gymers_throw::HandleScript(), HandleSpellClick(), IsOnVehicle(), go_wg_vehicle_teleporter::go_wg_vehicle_teleporterAI::IsValidVehicle(), GameObject::IsWithinDistInMap(), boss_gormok::boss_gormokAI::JustEngagedWith(), Mount(), npc_hover_disk::npc_hover_diskAI::MovementInform(), npc_enslaved_proto_drake::MovementInform(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::MovementInform(), npc_vics_flying_machine::npc_vics_flying_machineAI::MovementInform(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::npc_high_overlord_saurfangAI(), npc_orb_carrier::npc_orb_carrierAI::npc_orb_carrierAI(), spell_systems_shutdown_aura::OnApply(), VehicleAI::OnCharmed(), spell_blood_queen_frenzied_bloodthirst_aura::OnRemove(), FlameLeviathanPursuedTargetSelector::operator()(), OutDebugInfo(), npc_wintergarde_gryphon::PassengerBoarded(), boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::PassengerBoarded(), Map::PlayerRelocation(), SmartScript::ProcessAction(), boss_skadi_grauf::boss_skadi_graufAI::RemoveSkadi(), Spell::SelectImplicitCasterObjectTargets(), SmartAI::SmartAI(), npc_wintergarde_gryphon::SpellHit(), npc_vics_flying_machine::npc_vics_flying_machineAI::SpellHit(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit(), npc_storm_cloud::npc_storm_cloudAI::SpellHit(), boss_flame_leviathan::boss_flame_leviathanAI::SpellHitTarget(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::SpreadFire(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), npc_preparations_for_war_vehicle::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_wg_siege_machine::npc_wg_siege_machineAI::UpdateAI(), UpdateHeight(), and UpdateOrientation().

◆ GetVictim()

Unit * Unit::GetVictim ( ) const
inline
853{ return m_attacking; }

References m_attacking.

Referenced by boss_marli::_chargePlayer(), PetAI::_needToStop(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), SmartAI::AssistPlayerInCombatAgainst(), PetAI::AttackedBy(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::AttackedBy(), boss_malygos::boss_malygosAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), Object::BuildMovementUpdate(), Creature::CallAssistance(), Creature::CallForHelp(), TurretAI::CanAIAttack(), PetAI::CanAttack(), boss_attumen::CanMeleeHit(), boss_midnight::CanMeleeHit(), boss_swamplord_muselek::CanShootVictim(), Spell::CheckCast(), boss_mandokir::boss_mandokirAI::DamageDealt(), boss_garfrost::boss_garfrostAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_leotheras_the_blind::DemonTime(), boss_sacrolash::DoAction(), boss_alythess::DoAction(), boss_skadi::boss_skadiAI::DoAction(), UnitAI::DoCast(), UnitAI::DoCastVictim(), ConfusedMovementGenerator< T >::DoFinalize(), Creature::DoFleeToGetAssistance(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), ScriptedAI::DoStopAttack(), ChaseMovementGenerator< T >::DoUpdate(), Spell::EffectTaunt(), boss_ouro::Emerge(), AssistDelayEvent::Execute(), RestoreAttack::Execute(), StartMovementEvent::Execute(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::ExecuteEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::ExecuteEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::ExecuteEvent(), emerald_dragonAI::ExecuteEvent(), spell_shazzrah_gate_dummy::FilterTargets(), spell_malchezaar_enfeeble::FilterTargets(), spell_chain_burn::FilterTargets(), spell_morogrim_tidewalker_watery_grave::FilterTargets(), TimedFleeingMovementGenerator::Finalize(), getAttackerForHelper(), ThreatMgr::GetCurrentVictim(), Player::GetInitialVisiblePackets(), CreatureGroup::GetNewTargetForMember(), SmartScript::GetTargets(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), cast_commandscript::HandleCastTargetCommad(), spell_aggro_drones::HandleDummy(), spell_gen_threshalisk_charge::HandleDummy(), HandleDummyAuraProc(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_lurker_below_spout::HandleEffectRemove(), AuraEffect::HandleModPossessPet(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldSession::HandlePetActionHelper(), WorldSession::HandleSetRaidDifficultyOpcode(), ChaseMovementGenerator< T >::HasLostTarget(), Spell::InitExplicitTargets(), RotateMovementGenerator::Initialize(), IsMutualChase(), boss_ouro::IsPlayerWithinMeleeRange(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), npc_malchezaar_axe::JustEngagedWith(), boss_akilzon::JustEngagedWith(), boss_zuljin::JustEngagedWith(), npc_zealot_zath::JustEngagedWith(), npc_yor::JustEngagedWith(), npc_flame_of_azzinoth::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_nethermancer_sepethrea::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), boss_sacrolash::JustEngagedWith(), boss_alythess::JustEngagedWith(), boss_nalorakk::JustEngagedWith(), boss_vem::JustEngagedWith(), boss_veklor::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_midnight::JustSummoned(), boss_nightbane::JustSummoned(), boss_halazzi::JustSummoned(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_fathomguard_tidalvess::JustSummoned(), boss_the_black_stalker::JustSummoned(), boss_nethermancer_sepethrea::JustSummoned(), npc_nelson::npc_nelsonAI::JustSummoned(), npc_emily::npc_emilyAI::JustSummoned(), PetAI::KilledUnit(), boss_ick::boss_ickAI::KilledUnit(), boss_flame_leviathan::boss_flame_leviathanAI::KilledUnit(), spell_svalna_revive_champion::Land(), CreatureGroup::LeaderMoveTo(), CreatureGroup::MemberEngagingTarget(), SmartAI::MoveAway(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), npc_kerlonian::npc_kerlonianAI::MoveInLineOfSight(), npc_tooga::npc_toogaAI::MoveInLineOfSight(), npc_ringo::npc_ringoAI::MoveInLineOfSight(), boss_gluth::boss_gluthAI::MoveInLineOfSight(), npc_future_you::npc_future_youAI::MoveInLineOfSight(), npc_captain_saeed::npc_captain_saeedAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), boss_nightbane::MovementInform(), boss_bug_trio::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), boss_felmyst::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_kagani_nightstrike::MovementInform(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), npc_pet_mage_mirror_image::MySelectNextTarget(), NecroticPlagueTargetCheck::operator()(), NonTankTargetSelector::operator()(), BoneStormMoveTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), WebTargetSelector::operator()(), UnboundPlagueTargetSelector::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), boss_nefarian::PathEndReached(), SmartScript::ProcessEvent(), SmartScript::ProcessEventsFor(), SmartScript::ProcessTimedAction(), npc_mograine::npc_mograineAI::PullCathedral(), boss_grobbulus::boss_grobbulusAI::PullChamberAdds(), Creature::ReleaseFocus(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_pet_hunter_snake_trap::Reset(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), Resurrect(), boss_magtheridon::ScheduleCombatEvents(), npc_thaladred::ScheduleEvents(), boss_nightbane::ScheduleFly(), boss_the_lurker_below::SchedulerPhaseOne(), npc_giant_claw_tentacle::ScheduleTasks(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), PetAI::SelectNextTarget(), UnitAI::SelectTargetList(), SmartAI::SetCombatMove(), SetConfused(), SetFeared(), SetStunned(), boss_murmur::ShouldCastResonance(), boss_razorscale::boss_razorscaleAI::SpellHit(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), boss_quartermaster_zigris::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::SpellHitTarget(), npc_escortAI::Start(), FollowerAI::StartFollow(), StopAttackFaction(), StopAttackingInvalidTarget(), SummonCroneIfReady(), boss_akilzon::SummonEagles(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), boss_dorothee::SummonTito(), TauntApply(), TauntFadeOut(), npc_daphne_stilwell::npc_daphne_stilwellAI::Update(), Pet::Update(), Creature::Update(), Player::Update(), CasterAI::UpdateAI(), ArcherAI::UpdateAI(), SimpleCharmedAI::UpdateAI(), npc_escortAI::UpdateAI(), boss_general_angerforge::boss_general_angerforgeAI::UpdateAI(), boss_gorosh_the_dervish::boss_gorosh_the_dervishAI::UpdateAI(), boss_grizzle::boss_grizzleAI::UpdateAI(), boss_hedrum::boss_hedrumAI::UpdateAI(), boss_okthor::boss_okthorAI::UpdateAI(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_broodlord::boss_broodlordAI::UpdateAI(), boss_firemaw::boss_firemawAI::UpdateAI(), boss_flamegor::boss_flamegorAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_skeram::UpdateAI(), npc_muglash::npc_muglashAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_aquementas::npc_aquementasAI::UpdateAI(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), npc_shadowpriest_sezziz::npc_shadowpriest_sezzizAI::UpdateAI(), boss_taldaram::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_krik_thir::boss_krik_thirAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), npc_twilight_summon::npc_twilight_summonAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_toc_shaman::npc_toc_shamanAI::UpdateAI(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::UpdateAI(), npc_toc_warlock::npc_toc_warlockAI::UpdateAI(), npc_toc_mage::npc_toc_mageAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), npc_toc_boomkin::npc_toc_boomkinAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::UpdateAI(), npc_toc_pet_hunter::npc_toc_pet_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), npc_gunship_boarding_add::npc_gunship_boarding_add_realAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_vengeful_shade::npc_vengeful_shadeAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_spirit_warden::npc_spirit_wardenAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), npc_crystalline_frayer::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::UpdateAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_watcher::npc_ulduar_dark_rune_watcherAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_xt002_pummeller::npc_xt002_pummellerAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_archavon::boss_archavonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), npc_azure_invader::npc_azure_invaderAI::UpdateAI(), npc_azure_raider::npc_azure_raiderAI::UpdateAI(), npc_azure_captain::npc_azure_captainAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_lady_malande::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::UpdateAI(), npc_pet_gen_valkyr_guardian::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), guard_shattrath_scryer::guard_shattrath_scryerAI::UpdateAI(), guard_shattrath_aldor::guard_shattrath_aldorAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), PossessedAI::UpdateAI(), PetAI::UpdateAI(), FollowerAI::UpdateAI(), npc_zuljin_vortex::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), npc_pet_gen_gnomish_flame_turret::UpdateAI(), Player::UpdateCharmedAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), Player::UpdateFFAPvPFlag(), Player::UpdateFFAPvPState(), SmartAI::UpdatePath(), boss_netherspite::UpdatePortals(), CreatureAI::UpdateVictim(), CreatureAI::UpdateVictimWithGaze(), and boss_hexlord_malacrass::UseAbility().

◆ GetVirtualItemId()

uint32 Unit::GetVirtualItemId ( uint32  slot) const
21169{
21170 if (slot >= MAX_EQUIPMENT_ITEMS)
21171 return 0;
21172
21174}
@ UNIT_VIRTUAL_ITEM_SLOT_ID
Definition: UpdateFields.h:116
#define MAX_EQUIPMENT_ITEMS
Definition: CreatureData.h:35

References Object::GetUInt32Value(), MAX_EQUIPMENT_ITEMS, and UNIT_VIRTUAL_ITEM_SLOT_ID.

◆ GetVisibleAura()

AuraApplication * Unit::GetVisibleAura ( uint8  slot)
inline
1414 {
1415 VisibleAuraMap::iterator itr = m_visibleAuras.find(slot);
1416 if (itr != m_visibleAuras.end())
1417 return itr->second;
1418 return nullptr;
1419 }

References m_visibleAuras.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), AuraApplication::BuildUpdatePacket(), and WorldSession::HandleRequestPartyMemberStatsOpcode().

◆ GetVisibleAuras()

◆ GetWeaponDamageRange()

float Unit::GetWeaponDamageRange ( WeaponAttackType  attType,
WeaponDamageRange  type,
uint8  damageIndex = 0 
) const
15453{
15454 if (attType == OFF_ATTACK && !HasOffhandWeaponForAttack())
15455 return 0.0f;
15456
15457 return m_weaponDamage[attType][type][damageIndex];
15458}

References HasOffhandWeaponForAttack(), m_weaponDamage, and OFF_ATTACK.

Referenced by Player::_ApplyWeaponDamage(), Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), and Guardian::UpdateDamagePhysical().

◆ GetWeaponProcChance()

float Unit::GetWeaponProcChance ( ) const
13441{
13442 // normalized proc chance for weapon attack speed
13443 // (odd formula...)
13445 return (GetAttackTime(BASE_ATTACK) * 1.8f / 1000.0f);
13447 return (GetAttackTime(OFF_ATTACK) * 1.6f / 1000.0f);
13448 return 0;
13449}

References BASE_ATTACK, GetAttackTime(), HasOffhandWeaponForAttack(), isAttackReady(), and OFF_ATTACK.

Referenced by Player::CastItemCombatSpell().

◆ GetWeaponSkillValue()

uint32 Unit::GetWeaponSkillValue ( WeaponAttackType  attType,
Unit const *  target = nullptr 
) const
3791{
3792 uint32 value = 0;
3793 if (Player const* player = ToPlayer())
3794 {
3795 Item* item = player->GetWeaponForAttack(attType, true);
3796
3797 // feral or unarmed skill only for base attack
3798 if (attType != BASE_ATTACK && !item)
3799 return 0;
3800
3801 if (IsInFeralForm())
3802 return GetMaxSkillValueForLevel(); // always maximized SKILL_FERAL_COMBAT in fact
3803
3804 // weapon skill or (unarmed for base attack)
3805 uint32 skill = SKILL_UNARMED;
3806 if (item)
3807 skill = item->GetSkill();
3808
3809 // in PvP use full skill instead current skill value
3810 value = (target && target->IsControlledByPlayer())
3811 ? player->GetMaxSkillValue(skill)
3812 : player->GetSkillValue(skill);
3813 // Modify value from ratings
3814 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL));
3815 switch (attType)
3816 {
3817 case BASE_ATTACK:
3818 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_MAINHAND));
3819 break;
3820 case OFF_ATTACK:
3821 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_OFFHAND));
3822 break;
3823 case RANGED_ATTACK:
3824 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_RANGED));
3825 break;
3826 default:
3827 break;
3828 }
3829 }
3830 else
3831 value = GetUnitMeleeSkill(target);
3832 return value;
3833}
@ SKILL_UNARMED
Definition: SharedDefines.h:2907
@ CR_WEAPON_SKILL_RANGED
Definition: Unit.h:239
@ CR_WEAPON_SKILL
Definition: Unit.h:217
@ CR_WEAPON_SKILL_OFFHAND
Definition: Unit.h:238
@ CR_WEAPON_SKILL_MAINHAND
Definition: Unit.h:237
uint32 GetSkill()
Definition: Item.cpp:555
bool IsInFeralForm() const
Definition: Unit.h:1823

References BASE_ATTACK, CR_WEAPON_SKILL, CR_WEAPON_SKILL_MAINHAND, CR_WEAPON_SKILL_OFFHAND, CR_WEAPON_SKILL_RANGED, GetMaxSkillValueForLevel(), Item::GetSkill(), GetUnitMeleeSkill(), IsControlledByPlayer(), IsInFeralForm(), OFF_ATTACK, RANGED_ATTACK, SKILL_UNARMED, and Object::ToPlayer().

Referenced by isSpellBlocked(), MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), and Player::UpdateCritPercentage().

◆ HandleAuraProc()

bool Unit::HandleAuraProc ( Unit victim,
uint32  damage,
Aura triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
bool *  handled 
)
private
8740{
8741 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
8742
8743 switch (dummySpell->SpellFamilyName)
8744 {
8746 switch (dummySpell->Id)
8747 {
8748 // Nevermelting Ice Crystal
8749 case 71564:
8750 RemoveAuraFromStack(71564);
8751 *handled = true;
8752 break;
8753 // Gaseous Bloat
8754 case 70672:
8755 case 72455:
8756 case 72832:
8757 case 72833:
8758 {
8759 if (Unit* caster = triggeredByAura->GetCaster())
8760 if (victim && caster->GetGUID() == victim->GetGUID())
8761 {
8762 *handled = true;
8763 uint32 stack = triggeredByAura->GetStackAmount();
8764 int32 const mod = (GetMap()->GetSpawnMode() & 1) ? 1500 : 1250;
8765 int32 dmg = 0;
8766 for (uint8 i = 1; i <= stack; ++i)
8767 dmg += mod * i;
8768 caster->CastCustomSpell(70701, SPELLVALUE_BASE_POINT0, dmg);
8769 }
8770 break;
8771 }
8772 // Ball of Flames Proc
8773 case 71756:
8774 case 72782:
8775 case 72783:
8776 case 72784:
8777 RemoveAuraFromStack(dummySpell->Id);
8778 *handled = true;
8779 break;
8780 // Discerning Eye of the Beast
8781 case 59915:
8782 {
8783 CastSpell(this, 59914, true); // 59914 already has correct basepoints in DBC, no need for custom bp
8784 *handled = true;
8785 break;
8786 }
8787 // Swift Hand of Justice
8788 case 59906:
8789 {
8790 int32 bp0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_0]. CalcValue());
8791 CastCustomSpell(this, 59913, &bp0, nullptr, nullptr, true);
8792 *handled = true;
8793 break;
8794 }
8795 }
8796
8797 break;
8798 case SPELLFAMILY_MAGE:
8799 {
8800 // Combustion
8801 switch (dummySpell->Id)
8802 {
8803 case 11129:
8804 {
8805 *handled = true;
8806 Unit* caster = triggeredByAura->GetCaster();
8807 if (!caster || !damage)
8808 return false;
8809
8810 // last charge and crit
8811 if (triggeredByAura->GetCharges() <= 1 && (procEx & PROC_EX_CRITICAL_HIT))
8812 return true; // charge counting (will removed)
8813
8814 CastSpell(this, 28682, true);
8815
8816 return procEx & PROC_EX_CRITICAL_HIT;
8817 }
8818 // Empowered Fire
8819 case 31656:
8820 case 31657:
8821 case 31658:
8822 {
8823 *handled = true;
8824
8825 SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(67545);
8826 if (!spInfo)
8827 return false;
8828
8829 int32 bp0 = int32(CalculatePct(GetMaxPower(POWER_MANA), spInfo->Effects[0].CalcValue()));
8830 CastCustomSpell(this, 67545, &bp0, nullptr, nullptr, true, nullptr, triggeredByAura->GetEffect(EFFECT_0), GetGUID());
8831 return true;
8832 }
8833 }
8834 break;
8835 }
8837 {
8838 // Blood of the North
8839 // Reaping
8840 // Death Rune Mastery
8841 // xinef: Icon 22 is used for item bonus, skip
8842 if (dummySpell->SpellIconID == 3041 || (dummySpell->SpellIconID == 22 && dummySpell->Id != 62459) || dummySpell->SpellIconID == 2622)
8843 {
8844 *handled = true;
8845 // Convert recently used Blood Rune to Death Rune
8846 if (Player* player = ToPlayer())
8847 {
8848 if (!player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
8849 return false;
8850
8851 // xinef: not true
8852 //RuneType rune = ToPlayer()->GetLastUsedRune();
8853 // can't proc from death rune use
8854 //if (rune == RUNE_DEATH)
8855 // return false;
8856 AuraEffect* aurEff = triggeredByAura->GetEffect(EFFECT_0);
8857 if (!aurEff)
8858 return false;
8859
8860 // Reset amplitude - set death rune remove timer to 30s
8861 aurEff->ResetPeriodic(true);
8862 uint32 runesLeft;
8863
8864 if (dummySpell->SpellIconID == 2622)
8865 runesLeft = 2;
8866 else
8867 runesLeft = 1;
8868
8869 for (uint8 i = 0; i < MAX_RUNES && runesLeft; ++i)
8870 {
8871 if (dummySpell->SpellIconID == 2622)
8872 {
8873 if (player->GetCurrentRune(i) == RUNE_DEATH ||
8874 player->GetBaseRune(i) == RUNE_BLOOD)
8875 continue;
8876 }
8877 else
8878 {
8879 if (player->GetCurrentRune(i) == RUNE_DEATH ||
8880 player->GetBaseRune(i) != RUNE_BLOOD)
8881 continue;
8882 }
8883 if (player->GetRuneCooldown(i) != player->GetRuneBaseCooldown(i, false))
8884 continue;
8885
8886 --runesLeft;
8887 // Mark aura as used
8888 player->AddRuneByAuraEffect(i, RUNE_DEATH, aurEff);
8889 }
8890 return true;
8891 }
8892 return false;
8893 }
8894 break;
8895 }
8897 {
8898 switch (dummySpell->Id)
8899 {
8900 // Item - Warrior T10 Protection 4P Bonus
8901 case 70844:
8902 {
8903 int32 basepoints0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_1]. CalcValue());
8904 CastCustomSpell(this, 70845, &basepoints0, nullptr, nullptr, true);
8905 break;
8906 }
8907 default:
8908 break;
8909 }
8910 break;
8911 }
8912 case SPELLFAMILY_SHAMAN:
8913 {
8914 // Flurry
8915 if ((dummySpell->SpellFamilyFlags[1] & 0x00000200) != 0)
8916 {
8917 if (cooldown)
8918 {
8919 if (HasSpellCooldown(dummySpell->Id))
8920 {
8921 *handled = true;
8922 break;
8923 }
8924
8925 AddSpellCooldown(dummySpell->Id, 0, cooldown);
8926 }
8927 }
8928 break;
8929 }
8930 }
8931 return false;
8932}
@ EFFECT_1
Definition: SharedDefines.h:32
@ EFFECT_0
Definition: SharedDefines.h:31
@ SPELLFAMILY_MAGE
Definition: SharedDefines.h:3531
@ SPELLFAMILY_GENERIC
Definition: SharedDefines.h:3528
@ SPELLFAMILY_WARRIOR
Definition: SharedDefines.h:3532
@ SPELLFAMILY_SHAMAN
Definition: SharedDefines.h:3539
@ SPELLFAMILY_DEATHKNIGHT
Definition: SharedDefines.h:3543
@ RUNE_DEATH
Definition: Player.h:412
@ RUNE_BLOOD
Definition: Player.h:409
virtual bool HasSpellCooldown(uint32) const
Definition: Unit.h:1260
virtual void AddSpellCooldown(uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
Definition: Unit.h:1262
void RemoveAuraFromStack(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4925
uint8 GetSpawnMode() const
Definition: Map.h:418
void ResetPeriodic(bool resetPeriodicTimer=false)
Definition: SpellAuraEffects.h:89
AuraEffect * GetEffect(uint8 effIndex) const
Definition: SpellAuras.h:175

References AddSpellCooldown(), CalculatePct(), CastCustomSpell(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, EFFECT_0, EFFECT_1, SpellInfo::Effects, Aura::GetCaster(), Aura::GetCharges(), Aura::GetEffect(), Object::GetGUID(), WorldObject::GetMap(), GetMaxHealth(), GetMaxPower(), Map::GetSpawnMode(), Aura::GetSpellInfo(), Aura::GetStackAmount(), HasSpellCooldown(), SpellInfo::Id, MAX_RUNES, POWER_MANA, PROC_EX_CRITICAL_HIT, RemoveAuraFromStack(), AuraEffect::ResetPeriodic(), RUNE_BLOOD, RUNE_DEATH, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_GENERIC, SPELLFAMILY_MAGE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SPELLVALUE_BASE_POINT0, sSpellMgr, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleAuraRaidProcFromCharge()

bool Unit::HandleAuraRaidProcFromCharge ( AuraEffect triggeredByAura)
private
17653{
17654 // aura can be deleted at casts
17655 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17656
17657 uint32 damageSpellId;
17658 switch (spellProto->Id)
17659 {
17660 case 57949: // shiver
17661 damageSpellId = 57952;
17662 //animationSpellId = 57951; dummy effects for jump spell have unknown use (see also 41637)
17663 break;
17664 case 59978: // shiver
17665 damageSpellId = 59979;
17666 break;
17667 case 43593: // Cold Stare
17668 damageSpellId = 43594;
17669 break;
17670 default:
17671 LOG_ERROR("entities.unit", "Unit::HandleAuraRaidProcFromCharge, received unhandled spell: {}", spellProto->Id);
17672 return false;
17673 }
17674
17675 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17676
17677 // jumps
17678 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17679
17680 // current aura expire
17681 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17682
17683 // next target selection
17684 if (jumps > 0)
17685 {
17686 if (Unit* caster = triggeredByAura->GetCaster())
17687 {
17688 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17689 if (Unit* target = GetNextRandomRaidMemberOrPet(radius))
17690 {
17691 CastSpell(target, spellProto, true, nullptr, triggeredByAura, caster_guid);
17692 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17693 aura->SetCharges(jumps);
17694 }
17695 }
17696 }
17697
17698 CastSpell(this, damageSpellId, true, nullptr, triggeredByAura, caster_guid);
17699
17700 return true;
17701}
Unit * GetNextRandomRaidMemberOrPet(float radius)
Definition: Unit.cpp:11114
void SetCharges(uint8 charges)
Definition: SpellAuras.cpp:952

References CastSpell(), SpellInfo::Effects, AuraEffect::GetBase(), AuraEffect::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCharges(), AuraEffect::GetEffIndex(), GetNextRandomRaidMemberOrPet(), AuraEffect::GetSpellInfo(), SpellInfo::Id, LOG_ERROR, and Aura::SetCharges().

Referenced by ProcDamageAndSpellFor().

◆ HandleAuraRaidProcFromChargeWithValue()

bool Unit::HandleAuraRaidProcFromChargeWithValue ( AuraEffect triggeredByAura)
private
17564{
17565 // aura can be deleted at casts
17566 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17567 int32 heal = triggeredByAura->GetAmount();
17568 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17569
17570 // Currently only Prayer of Mending
17571 if (!(spellProto->SpellFamilyName == SPELLFAMILY_PRIEST && spellProto->SpellFamilyFlags[1] & 0x20))
17572 {
17573 LOG_DEBUG("spells.aura", "Unit::HandleAuraRaidProcFromChargeWithValue, received not handled spell: {}", spellProto->Id);
17574 return false;
17575 }
17576
17577 // jumps
17578 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17579
17580 // current aura expire
17581 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17582
17583 // next target selection
17584 if (jumps > 0)
17585 {
17586 if (Unit* caster = triggeredByAura->GetCaster())
17587 {
17588 // smart healing
17589 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17590 std::list<Unit*> nearMembers;
17591
17592 Player* player = nullptr;
17593 if (IsPlayer())
17594 player = ToPlayer();
17595 else if (GetOwner())
17596 player = GetOwner()->ToPlayer();
17597
17598 if (player)
17599 {
17600 Group* group = player->GetGroup();
17601 if (!group)
17602 {
17603 if (player != this)
17604 {
17605 if (IsWithinDistInMap(player, radius))
17606 nearMembers.push_back(player);
17607 }
17608 else if (Unit* pet = GetGuardianPet())
17609 {
17610 if (IsWithinDistInMap(pet, radius))
17611 nearMembers.push_back(pet);
17612 }
17613 }
17614 else
17615 {
17616 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
17617 if (Player* Target = itr->GetSource())
17618 {
17619 if (Target != this && !IsWithinDistInMap(Target, radius))
17620 continue;
17621
17622 // IsHostileTo check duel and controlled by enemy
17623 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
17624 nearMembers.push_back(Target);
17625
17626 // Push player's pet to vector
17627 if (Unit* pet = Target->GetGuardianPet())
17628 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
17629 nearMembers.push_back(pet);
17630 }
17631 }
17632
17633 if (!nearMembers.empty())
17634 {
17635 nearMembers.sort(Acore::HealthPctOrderPred());
17636 if (Unit* target = nearMembers.front())
17637 {
17638 CastSpell(target, 41637 /*Dummy visual effect triggered by main spell cast*/, true);
17639 CastCustomSpell(target, spellProto->Id, &heal, nullptr, nullptr, true, nullptr, triggeredByAura, caster_guid);
17640 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17641 aura->SetCharges(jumps);
17642 }
17643 }
17644 }
17645 }
17646 }
17647
17648 // heal
17649 CastCustomSpell(this, 33110, &heal, nullptr, nullptr, true, nullptr, nullptr, caster_guid);
17650 return true;
17651}
@ SPELLFAMILY_PRIEST
Definition: SharedDefines.h:3534
Definition: Unit.h:2161

References CastCustomSpell(), CastSpell(), SpellInfo::Effects, AuraEffect::GetAmount(), AuraEffect::GetBase(), AuraEffect::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCharges(), AuraEffect::GetEffIndex(), Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), GetOwner(), AuraEffect::GetSpellInfo(), SpellInfo::Id, IsHostileTo(), Object::IsPlayer(), WorldObject::IsWithinDistInMap(), LOG_DEBUG, GroupReference::next(), Aura::SetCharges(), SPELLFAMILY_PRIEST, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleDummyAuraProc()

bool Unit::HandleDummyAuraProc ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
ProcEventInfo const &  eventInfo 
)
private
Todo:
: It should be moved to database, shouldn't it?
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
Todo:
: need more info (cooldowns/PPM)
6590{
6591 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
6592 uint32 effIndex = triggeredByAura->GetEffIndex();
6593 int32 triggerAmount = triggeredByAura->GetAmount();
6594 Spell const* spellProc = eventInfo.GetProcSpell();
6595
6596 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
6597 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
6598
6599 uint32 triggered_spell_id = 0;
6600 uint32 cooldown_spell_id = 0; // for random trigger, will be one of the triggered spell to avoid repeatable triggers
6601 // otherwise, it's the triggered_spell_id by default
6602 Unit* target = victim;
6603 int32 basepoints0 = 0;
6604 ObjectGuid originalCaster;
6605
6606 switch (dummySpell->SpellFamilyName)
6607 {
6609 {
6610 switch (dummySpell->Id)
6611 {
6612 // Overkill
6613 case 58426:
6614 {
6615 triggered_spell_id = 58427;
6616 break;
6617 }
6618 // Unstable Power
6619 case 24658:
6620 {
6621 if (!procSpell || procSpell->Id == 24659)
6622 return false;
6623 // Need remove one 24659 aura
6624 RemoveAuraFromStack(24659);
6625 return true;
6626 }
6627 // Restless Strength
6628 case 24661:
6629 {
6630 // Need remove one 24662 aura
6631 RemoveAuraFromStack(24662);
6632 return true;
6633 }
6634 // Mark of Malice
6635 case 33493:
6636 {
6637 if (triggeredByAura->GetBase()->GetCharges() > 1)
6638 return true;
6639
6640 target = this;
6641 triggered_spell_id = 33494;
6642 break;
6643 }
6644 // Twisted Reflection (boss spell)
6645 case 21063:
6646 triggered_spell_id = 21064;
6647 break;
6648 // Vampiric Aura (boss spell)
6649 case 38196:
6650 {
6651 basepoints0 = 3 * damage; // 300%
6652 if (basepoints0 < 0)
6653 return false;
6654
6655 triggered_spell_id = 31285;
6656 target = this;
6657 break;
6658 }
6659 // Aura of Madness (Darkmoon Card: Madness trinket)
6660 //=====================================================
6661 // 39511 Sociopath: +35 strength (Paladin, Rogue, Druid, Warrior)
6662 // 40997 Delusional: +70 attack power (Rogue, Hunter, Paladin, Warrior, Druid)
6663 // 40998 Kleptomania: +35 agility (Warrior, Rogue, Paladin, Hunter, Druid)
6664 // 40999 Megalomania: +41 damage/healing (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6665 // 41002 Paranoia: +35 spell/melee/ranged crit strike rating (All classes)
6666 // 41005 Manic: +35 haste (spell, melee and ranged) (All classes)
6667 // 41009 Narcissism: +35 intellect (Druid, Shaman, Priest, Warlock, Mage, Paladin, Hunter)
6668 // 41011 Martyr Complex: +35 stamina (All classes)
6669 // 41406 Dementia: Every 5 seconds either gives you +5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6670 // 41409 Dementia: Every 5 seconds either gives you -5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6671 case 39446:
6672 {
6673 if (!IsPlayer() || !IsAlive())
6674 return false;
6675
6676 // Select class defined buff
6677 switch (getClass())
6678 {
6679 case CLASS_PALADIN: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
6680 case CLASS_DRUID: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
6681 triggered_spell_id = RAND(39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409);
6682 cooldown_spell_id = 39511;
6683 break;
6684 case CLASS_ROGUE: // 39511, 40997, 40998, 41002, 41005, 41011
6685 case CLASS_WARRIOR: // 39511, 40997, 40998, 41002, 41005, 41011
6686 case CLASS_DEATH_KNIGHT:
6687 triggered_spell_id = RAND(39511, 40997, 40998, 41002, 41005, 41011);
6688 cooldown_spell_id = 39511;
6689 break;
6690 case CLASS_PRIEST: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6691 case CLASS_SHAMAN: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6692 case CLASS_MAGE: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6693 case CLASS_WARLOCK: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6694 triggered_spell_id = RAND(40999, 41002, 41005, 41009, 41011, 41406, 41409);
6695 cooldown_spell_id = 40999;
6696 break;
6697 case CLASS_HUNTER: // 40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409
6698 triggered_spell_id = RAND(40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409);
6699 cooldown_spell_id = 40997;
6700 break;
6701 default:
6702 return false;
6703 }
6704
6705 target = this;
6706 if (roll_chance_i(10))
6707 ToPlayer()->Say("This is Madness!", LANG_UNIVERSAL);
6708 break;
6709 }
6710 // Sunwell Exalted Caster Neck (??? neck)
6711 // cast ??? Light's Wrath if Exalted by Aldor
6712 // cast ??? Arcane Bolt if Exalted by Scryers
6713 case 46569:
6714 return false; // old unused version
6715 // Sunwell Exalted Caster Neck (Shattered Sun Pendant of Acumen neck)
6716 // cast 45479 Light's Wrath if Exalted by Aldor
6717 // cast 45429 Arcane Bolt if Exalted by Scryers
6718 case 45481:
6719 {
6720 Player* player = ToPlayer();
6721 if (!player)
6722 return false;
6723
6724 // Get Aldor reputation rank
6725 if (player->GetReputationRank(932) == REP_EXALTED)
6726 {
6727 target = this;
6728 triggered_spell_id = 45479;
6729 break;
6730 }
6731 // Get Scryers reputation rank
6732 if (player->GetReputationRank(934) == REP_EXALTED)
6733 {
6734 // triggered at positive/self casts also, current attack target used then
6735 if (target && IsFriendlyTo(target))
6736 {
6737 target = GetVictim();
6738 if (!target)
6739 {
6740 target = player->GetSelectedUnit();
6741 if (!target)
6742 return false;
6743 }
6744 if (IsFriendlyTo(target))
6745 return false;
6746 }
6747
6748 triggered_spell_id = 45429;
6749 break;
6750 }
6751 return false;
6752 }
6753 // Sunwell Exalted Melee Neck (Shattered Sun Pendant of Might neck)
6754 // cast 45480 Light's Strength if Exalted by Aldor
6755 // cast 45428 Arcane Strike if Exalted by Scryers
6756 case 45482:
6757 {
6758 if (!IsPlayer())
6759 return false;
6760
6761 // Get Aldor reputation rank
6762 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6763 {
6764 target = this;
6765 triggered_spell_id = 45480;
6766 break;
6767 }
6768 // Get Scryers reputation rank
6769 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6770 {
6771 triggered_spell_id = 45428;
6772 break;
6773 }
6774 return false;
6775 }
6776 // Sunwell Exalted Tank Neck (Shattered Sun Pendant of Resolve neck)
6777 // cast 45431 Arcane Insight if Exalted by Aldor
6778 // cast 45432 Light's Ward if Exalted by Scryers
6779 case 45483:
6780 {
6781 if (!IsPlayer())
6782 return false;
6783
6784 // Get Aldor reputation rank
6785 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6786 {
6787 target = this;
6788 triggered_spell_id = 45432;
6789 break;
6790 }
6791 // Get Scryers reputation rank
6792 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6793 {
6794 target = this;
6795 triggered_spell_id = 45431;
6796 break;
6797 }
6798 return false;
6799 }
6800 // Sunwell Exalted Healer Neck (Shattered Sun Pendant of Restoration neck)
6801 // cast 45478 Light's Salvation if Exalted by Aldor
6802 // cast 45430 Arcane Surge if Exalted by Scryers
6803 case 45484:
6804 {
6805 if (!IsPlayer())
6806 return false;
6807
6808 // Get Aldor reputation rank
6809 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6810 {
6811 target = this;
6812 triggered_spell_id = 45478;
6813 break;
6814 }
6815 // Get Scryers reputation rank
6816 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6817 {
6818 triggered_spell_id = 45430;
6819 break;
6820 }
6821 return false;
6822 }
6823 // Kill command
6824 case 58914:
6825 {
6826 // Remove aura stack from pet
6827 RemoveAuraFromStack(58914);
6828 Unit* owner = GetOwner();
6829 if (!owner)
6830 return true;
6831 // reduce the owner's aura stack
6832 owner->RemoveAuraFromStack(34027);
6833 return true;
6834 }
6835 // Vampiric Touch (generic, used by some boss)
6836 case 52723:
6837 case 60501:
6838 {
6839 triggered_spell_id = 52724;
6840 basepoints0 = damage / 2;
6841 target = this;
6842 break;
6843 }
6844 // Divine purpose
6845 case 31871:
6846 case 31872:
6847 {
6848 // Roll chane
6849 if (!victim || !victim->IsAlive() || !roll_chance_i(triggerAmount))
6850 return false;
6851
6852 // Remove any stun effect on target
6854 return true;
6855 }
6856 // Glyph of Life Tap
6857 case 63320:
6858 {
6859 triggered_spell_id = 63321; // Life Tap
6860 break;
6861 }
6862 case 71519: // Deathbringer's Will Normal
6863 {
6864 if (!IsPlayer() || HasSpellCooldown(71484))
6865 return false;
6866
6867 AddSpellCooldown(71484, 0, cooldown);
6868
6869 std::vector<uint32> RandomSpells;
6870 switch (getClass())
6871 {
6872 case CLASS_WARRIOR:
6873 case CLASS_PALADIN:
6874 case CLASS_DEATH_KNIGHT:
6875 RandomSpells.push_back(71484);
6876 RandomSpells.push_back(71491);
6877 RandomSpells.push_back(71492);
6878 break;
6879 case CLASS_SHAMAN:
6880 case CLASS_ROGUE:
6881 RandomSpells.push_back(71486);
6882 RandomSpells.push_back(71485);
6883 RandomSpells.push_back(71492);
6884 break;
6885 case CLASS_DRUID:
6886 RandomSpells.push_back(71484);
6887 RandomSpells.push_back(71485);
6888 RandomSpells.push_back(71492);
6889 break;
6890 case CLASS_HUNTER:
6891 RandomSpells.push_back(71486);
6892 RandomSpells.push_back(71491);
6893 RandomSpells.push_back(71485);
6894 break;
6895 default:
6896 return false;
6897 }
6898 if (RandomSpells.empty()) // shouldn't happen
6899 return false;
6900
6901 uint8 rand_spell = irand(0, (RandomSpells.size() - 1));
6902 CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
6903 break;
6904 }
6905 case 71562: // Deathbringer's Will Heroic
6906 {
6907 if (!IsPlayer() || HasSpellCooldown(71561))
6908 return false;
6909
6910 AddSpellCooldown(71561, 0, cooldown);
6911
6912 std::vector<uint32> RandomSpells;
6913 switch (getClass())
6914 {
6915 case CLASS_WARRIOR:
6916 case CLASS_PALADIN:
6917 case CLASS_DEATH_KNIGHT:
6918 RandomSpells.push_back(71561);
6919 RandomSpells.push_back(71559);
6920 RandomSpells.push_back(71560);
6921 break;
6922 case CLASS_SHAMAN:
6923 case CLASS_ROGUE:
6924 RandomSpells.push_back(71558);
6925 RandomSpells.push_back(71556);
6926 RandomSpells.push_back(71560);
6927 break;
6928 case CLASS_DRUID:
6929 RandomSpells.push_back(71561);
6930 RandomSpells.push_back(71556);
6931 RandomSpells.push_back(71560);
6932 break;
6933 case CLASS_HUNTER:
6934 RandomSpells.push_back(71558);
6935 RandomSpells.push_back(71559);
6936 RandomSpells.push_back(71556);
6937 break;
6938 default:
6939 return false;
6940 }
6941 if (RandomSpells.empty()) // shouldn't happen
6942 return false;
6943
6944 uint8 rand_spell = irand(0, (RandomSpells.size() - 1));
6945 CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
6946 break;
6947 }
6948 // Freya, Petrified Bark
6949 case 62933:
6950 case 62337:
6951 {
6952 if (!victim)
6953 return false;
6954
6955 int32 dmg = damage;
6956 victim->CastCustomSpell(this, 62379, &dmg, 0, 0, true);
6957 return true;
6958 }
6959 // Trial of the Champion, Earth Shield
6960 case 67534:
6961 {
6962 const int32 dmg = (int32)damage;
6963 CastCustomSpell(this, 67535, &dmg, nullptr, nullptr, true, 0, triggeredByAura, triggeredByAura->GetCasterGUID());
6964 return true;
6965 }
6966 // Trial of the Crusader, Faction Champions, Retaliation
6967 case 65932:
6968 {
6969 // check attack comes not from behind
6970 if (!victim || !HasInArc(M_PI, victim))
6971 return false;
6972
6973 triggered_spell_id = 65934;
6974 break;
6975 }
6976 // Pit of Saron, Tyrannus, Overlord's Brand
6977 case 69172: // everything except for DoTs
6978 {
6979 if (!target)
6980 return false;
6981 if (Unit* caster = triggeredByAura->GetCaster())
6982 {
6984 {
6985 int32 dmg = 5.5f * damage;
6986 target->CastCustomSpell(caster, 69190, &dmg, 0, 0, true);
6987 }
6988 else
6989 {
6990 if (caster->GetVictim())
6991 {
6992 int32 dmg = damage;
6993 target->CastCustomSpell(caster->GetVictim(), 69189, &dmg, 0, 0, true);
6994 }
6995 }
6996 }
6997 return true;
6998 }
6999 // Pit of Saron, Tyrannus, Overlord's Brand
7000 case 69173: // only DoTs
7001 {
7002 if (!target)
7003 return false;
7004 if (Unit* caster = triggeredByAura->GetCaster())
7005 {
7006 if (procEx & PROC_EX_INTERNAL_HOT)
7007 {
7008 int32 dmg = 5.5f * damage;
7009 target->CastCustomSpell(caster, 69190, &dmg, 0, 0, true);
7010 }
7011 else
7012 {
7013 if (caster->GetVictim())
7014 {
7015 int32 dmg = damage;
7016 target->CastCustomSpell(caster->GetVictim(), 69189, &dmg, 0, 0, true);
7017 }
7018 }
7019 }
7020 return true;
7021 }
7022 // Icecrown Citadel, Lady Deathwhisper, Vampiric Might
7023 case 70674:
7024 {
7025 if (Unit* caster = triggeredByAura->GetCaster())
7026 {
7027 int32 dmg = 3 * damage;
7028 caster->CastCustomSpell(caster, 70677, &dmg, 0, 0, true);
7029 }
7030 return true;
7031 }
7032 // Item: Purified Shard of the Gods
7033 case 69755:
7034 {
7035 triggered_spell_id = ((procFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) ? 69733 : 69729);
7036 break;
7037 }
7038 // Item: Shiny Shard of the Gods
7039 case 69739:
7040 {
7041 triggered_spell_id = ((procFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) ? 69734 : 69730);
7042 break;
7043 }
7044 // VoA: Meteor Fists koralon
7045 case 66725:
7046 case 68161:
7047 {
7048 triggered_spell_id = 66765; // handled by spell_difficulty
7049 break;
7050 }
7051 }
7052 break;
7053 }
7054 case SPELLFAMILY_MAGE:
7055 {
7056 // Magic Absorption
7057 if (dummySpell->SpellIconID == 459) // only this spell has SpellIconID == 459 and dummy aura
7058 {
7060 return false;
7061
7062 // mana reward
7063 basepoints0 = CalculatePct(int32(GetMaxPower(POWER_MANA)), triggerAmount);
7064 target = this;
7065 triggered_spell_id = 29442;
7066 break;
7067 }
7068 // Hot Streak
7069 if (dummySpell->SpellIconID == 2999)
7070 {
7071 if (effIndex != 0)
7072 return false;
7073 AuraEffect* counter = triggeredByAura->GetBase()->GetEffect(EFFECT_1);
7074 if (!counter)
7075 return true;
7076
7077 // Count spell criticals in a row in second aura
7078 if (procEx & PROC_EX_CRITICAL_HIT)
7079 {
7080 counter->SetAmount(counter->GetAmount() * 2);
7081 if (counter->GetAmount() < 100) // not enough
7082 return true;
7083 // Crititcal counted -> roll chance
7084 if (roll_chance_i(triggerAmount))
7085 CastSpell(this, 48108, true, castItem, triggeredByAura);
7086 }
7087 counter->SetAmount(25);
7088 return true;
7089 }
7090 // Incanter's Regalia set (add trigger chance to Mana Shield)
7091 if (dummySpell->SpellFamilyFlags[0] & 0x8000)
7092 {
7093 if (!IsPlayer())
7094 return false;
7095
7096 target = this;
7097 triggered_spell_id = 37436;
7098 break;
7099 }
7100 switch (dummySpell->Id)
7101 {
7102 // Glyph of Polymorph
7103 case 56375:
7104 {
7105 if (!target)
7106 return false;
7107 target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, ObjectGuid::Empty, target->GetAura(32409)); // SW:D shall not be removed.
7110 return true;
7111 }
7112 // Glyph of Icy Veins
7113 case 56374:
7114 {
7117 return true;
7118 }
7119 // Glyph of Ice Block
7120 case 56372:
7121 {
7122 Player* player = ToPlayer();
7123 if (!player)
7124 return false;
7125
7126 SpellCooldowns const cooldowns = player->GetSpellCooldowns();
7127 // remove cooldowns on all ranks of Frost Nova
7128 for (SpellCooldowns::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
7129 {
7130 SpellInfo const* cdSpell = sSpellMgr->GetSpellInfo(itr->first);
7131 // Frost Nova
7132 if (cdSpell && cdSpell->SpellFamilyName == SPELLFAMILY_MAGE
7133 && cdSpell->SpellFamilyFlags[0] & 0x00000040)
7134 player->RemoveSpellCooldown(cdSpell->Id, true);
7135 }
7136 break;
7137 }
7138 }
7139 break;
7140 }
7142 {
7143 switch (dummySpell->Id)
7144 {
7145 // Victorious
7146 case 32216:
7147 {
7148 RemoveAura(dummySpell->Id);
7149 return false;
7150 }
7151 }
7152
7153 // Second Wind
7154 if (dummySpell->SpellIconID == 1697)
7155 {
7156 // only for spells and hit/crit (trigger start always) and not start from self casted spells (5530 Mace Stun Effect for example)
7157 if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
7158 return false;
7159 // Need stun or root mechanic
7160 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN))))
7161 return false;
7162
7163 switch (dummySpell->Id)
7164 {
7165 case 29838:
7166 triggered_spell_id = 29842;
7167 break;
7168 case 29834:
7169 triggered_spell_id = 29841;
7170 break;
7171 case 42770:
7172 triggered_spell_id = 42771;
7173 break;
7174 default:
7175 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non handled spell id: {} (SW)", dummySpell->Id);
7176 return false;
7177 }
7178
7179 target = this;
7180 break;
7181 }
7182 break;
7183 }
7185 {
7186 switch (dummySpell->Id)
7187 {
7188 // Nightfall
7189 case 18094:
7190 case 18095:
7191 // Glyph of corruption
7192 case 56218:
7193 {
7194 target = this;
7195 triggered_spell_id = 17941;
7196 break;
7197 }
7198 // Soul Leech
7199 case 30293:
7200 case 30295:
7201 case 30296:
7202 {
7203 // Improved Soul Leech
7204 AuraEffectList const& SoulLeechAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
7205 for (Unit::AuraEffectList::const_iterator i = SoulLeechAuras.begin(); i != SoulLeechAuras.end(); ++i)
7206 {
7207 if ((*i)->GetId() == 54117 || (*i)->GetId() == 54118)
7208 {
7209 if ((*i)->GetEffIndex() != 0)
7210 continue;
7211 basepoints0 = int32((*i)->GetAmount());
7212 target = GetGuardianPet();
7213 if (target)
7214 {
7215 // regen mana for pet
7216 CastCustomSpell(target, 54607, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
7217 }
7218 // regen mana for caster
7219 CastCustomSpell(this, 59117, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
7220 // Get second aura of spell for replenishment effect on party
7221 if (AuraEffect const* aurEff = (*i)->GetBase()->GetEffect(EFFECT_1))
7222 {
7223 // Replenishment - roll chance
7224 if (roll_chance_i(aurEff->GetAmount()))
7225 {
7226 CastSpell(this, 57669, true, castItem, triggeredByAura);
7227 }
7228 }
7229 break;
7230 }
7231 }
7232 // health
7233 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7234 target = this;
7235 triggered_spell_id = 30294;
7236 break;
7237 }
7238 // Shadowflame (Voidheart Raiment set bonus)
7239 case 37377:
7240 {
7241 triggered_spell_id = 37379;
7242 break;
7243 }
7244 // Pet Healing (Corruptor Raiment or Rift Stalker Armor)
7245 case 37381:
7246 {
7247 target = GetGuardianPet();
7248 if (!target)
7249 return false;
7250
7251 // heal amount
7252 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7253 triggered_spell_id = 37382;
7254 break;
7255 }
7256 // Shadowflame Hellfire (Voidheart Raiment set bonus)
7257 case 39437:
7258 {
7259 triggered_spell_id = 37378;
7260 break;
7261 }
7262 }
7263 break;
7264 }
7265 case SPELLFAMILY_PRIEST:
7266 {
7267 // Body and Soul
7268 if (dummySpell->SpellIconID == 2218)
7269 {
7270 // Proc only from Abolish desease on self cast
7271 if (procSpell->Id != 552 || victim != this || !roll_chance_i(triggerAmount))
7272 return false;
7273 triggered_spell_id = 64136;
7274 target = this;
7275 break;
7276 }
7277 switch (dummySpell->Id)
7278 {
7279 // Vampiric Embrace
7280 case 15286:
7281 {
7282 if (!victim || !victim->IsAlive() || procSpell->SpellFamilyFlags[1] & 0x80000)
7283 return false;
7284
7285 // heal amount
7286 int32 total = CalculatePct(int32(damage), triggerAmount);
7287 int32 team = total / 5;
7288 int32 self = total - team;
7289 CastCustomSpell(this, 15290, &team, &self, nullptr, true, castItem, triggeredByAura);
7290 return true; // no hidden cooldown
7291 }
7292 // Priest Tier 6 Trinket (Ashtongue Talisman of Acumen)
7293 case 40438:
7294 {
7295 // Shadow Word: Pain
7296 if (procSpell->SpellFamilyFlags[0] & 0x8000)
7297 triggered_spell_id = 40441;
7298 // Renew
7299 else if (procSpell->SpellFamilyFlags[0] & 0x40)
7300 triggered_spell_id = 40440;
7301 else
7302 return false;
7303
7304 target = this;
7305 break;
7306 }
7307 // Improved Shadowform
7308 case 47570:
7309 case 47569:
7310 {
7311 if (!roll_chance_i(triggerAmount))
7312 return false;
7313
7315 break;
7316 }
7317 // Glyph of Dispel Magic
7318 case 55677:
7319 {
7320 // Dispel Magic shares spellfamilyflag with abolish disease
7321 if (procSpell->SpellIconID != 74)
7322 return false;
7323 if (!target || !target->IsFriendlyTo(this))
7324 return false;
7325
7326 basepoints0 = int32(target->CountPctFromMaxHealth(triggerAmount));
7327 triggered_spell_id = 56131;
7328 break;
7329 }
7330 // Oracle Healing Bonus ("Garments of the Oracle" set)
7331 case 26169:
7332 {
7333 // heal amount
7334 basepoints0 = int32(CalculatePct(damage, 10));
7335 target = this;
7336 triggered_spell_id = 26170;
7337 break;
7338 }
7339 // Frozen Shadoweave (Shadow's Embrace set) warning! its not only priest set
7340 case 39372:
7341 {
7342 if (!procSpell || (procSpell->GetSchoolMask() & (SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_SHADOW)) == 0)
7343 return false;
7344
7345 // heal amount
7346 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7347 target = this;
7348 triggered_spell_id = 39373;
7349 break;
7350 }
7351 // Greater Heal (Vestments of Faith (Priest Tier 3) - 4 pieces bonus)
7352 case 28809:
7353 {
7354 triggered_spell_id = 28810;
7355 break;
7356 }
7357 // Priest T10 Healer 2P Bonus
7358 case 70770:
7359 // Flash Heal
7360 if (procSpell->SpellFamilyFlags[0] & 0x800)
7361 {
7362 triggered_spell_id = 70772;
7363 SpellInfo const* blessHealing = sSpellMgr->GetSpellInfo(triggered_spell_id);
7364 if (!blessHealing || !victim)
7365 return false;
7366 basepoints0 = int32(CalculatePct(damage, triggerAmount) / (blessHealing->GetMaxDuration() / blessHealing->Effects[0].Amplitude));
7367 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_HEAL, basepoints0);
7368 return true;
7369 }
7370 break;
7371 }
7372 break;
7373 }
7374 case SPELLFAMILY_DRUID:
7375 {
7376 switch (dummySpell->Id)
7377 {
7378 // Glyph of Innervate
7379 case 54832:
7380 {
7381 if (procSpell->SpellIconID != 62)
7382 return false;
7383
7384 int32 mana_perc = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcValue();
7385 basepoints0 = int32(CalculatePct(GetCreatePowers(POWER_MANA), mana_perc) / 10);
7386 triggered_spell_id = 54833;
7387 target = this;
7388 break;
7389 }
7390 // Glyph of Starfire
7391 case 54845:
7392 {
7393 triggered_spell_id = 54846;
7394 break;
7395 }
7396 // Glyph of Shred
7397 case 54815:
7398 {
7399 if (!target)
7400 return false;
7401
7402 // try to find spell Rip on the target
7403 if (AuraEffect const* AurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00800000, 0x0, 0x0, GetGUID()))
7404 {
7405 // Rip's max duration, note: spells which modifies Rip's duration also counted like Glyph of Rip
7406 uint32 CountMin = AurEff->GetBase()->GetMaxDuration();
7407
7408 // just Rip's max duration without other spells
7409 uint32 CountMax = AurEff->GetSpellInfo()->GetMaxDuration();
7410
7411 // add possible auras' and Glyph of Shred's max duration
7412 CountMax += 3 * triggerAmount * IN_MILLISECONDS; // Glyph of Shred -> +6 seconds
7413 CountMax += HasAura(54818) ? 4 * IN_MILLISECONDS : 0; // Glyph of Rip -> +4 seconds
7414 CountMax += HasAura(60141) ? 4 * IN_MILLISECONDS : 0; // Rip Duration/Lacerate Damage -> +4 seconds
7415
7416 // if min < max -> that means caster didn't cast 3 shred yet
7417 // so set Rip's duration and max duration
7418 if (CountMin < CountMax)
7419 {
7420 AurEff->GetBase()->SetDuration(AurEff->GetBase()->GetDuration() + triggerAmount * IN_MILLISECONDS);
7421 AurEff->GetBase()->SetMaxDuration(CountMin + triggerAmount * IN_MILLISECONDS);
7422 return true;
7423 }
7424 }
7425 // if not found Rip
7426 return false;
7427 }
7428 // Glyph of Rake
7429 case 54821:
7430 {
7431 if (procSpell->SpellVisual[0] == 750 && procSpell->Effects[1].ApplyAuraName == 3)
7432 {
7433 if (target && target->IsCreature())
7434 {
7435 triggered_spell_id = 54820;
7436 break;
7437 }
7438 }
7439 return false;
7440 }
7441 // Leader of the Pack
7442 case 24932:
7443 {
7444 if (triggerAmount <= 0)
7445 return false;
7446 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
7447 target = this;
7448 triggered_spell_id = 34299;
7449 if (triggeredByAura->GetCasterGUID() != GetGUID())
7450 break;
7451 int32 basepoints1 = CalculatePct(GetMaxPower(Powers(POWER_MANA)), triggerAmount * 2);
7452 // Improved Leader of the Pack
7453 // Check cooldown of heal spell cooldown
7454 if (IsPlayer() && !ToPlayer()->HasSpellCooldown(34299))
7455 CastCustomSpell(this, 68285, &basepoints1, 0, 0, true, 0, triggeredByAura);
7456 break;
7457 }
7458 // Healing Touch (Dreamwalker Raiment set)
7459 case 28719:
7460 {
7461 // mana back
7462 basepoints0 = int32(CalculatePct(spellProc->GetPowerCost(), 30));
7463 target = this;
7464 triggered_spell_id = 28742;
7465 break;
7466 }
7467 // Glyph of Rejuvenation
7468 case 54754:
7469 {
7470 if (!victim || !victim->HealthBelowPct(uint32(triggerAmount)))
7471 return false;
7472 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7473 triggered_spell_id = 54755;
7474 break;
7475 }
7476 // Healing Touch Refund (Idol of Longevity trinket)
7477 case 28847:
7478 {
7479 target = this;
7480 triggered_spell_id = 28848;
7481 break;
7482 }
7483 // Mana Restore (Malorne Raiment set / Malorne Regalia set)
7484 case 37288:
7485 case 37295:
7486 {
7487 target = this;
7488 triggered_spell_id = 37238;
7489 break;
7490 }
7491 // Druid Tier 6 Trinket
7492 case 40442:
7493 {
7494 float chance;
7495
7496 // Starfire
7497 if (procSpell->SpellFamilyFlags[0] & 0x4)
7498 {
7499 triggered_spell_id = 40445;
7500 chance = 25.0f;
7501 }
7502 // Rejuvenation
7503 else if (procSpell->SpellFamilyFlags[0] & 0x10)
7504 {
7505 triggered_spell_id = 40446;
7506 chance = 25.0f;
7507 }
7508 // Mangle (Bear) and Mangle (Cat)
7509 else if (procSpell->SpellFamilyFlags[1] & 0x00000440)
7510 {
7511 triggered_spell_id = 40452;
7512 chance = 40.0f;
7513 }
7514 else
7515 return false;
7516
7517 if (!roll_chance_f(chance))
7518 return false;
7519
7520 target = this;
7521 break;
7522 }
7523 // Maim Interrupt
7524 case 44835:
7525 {
7526 // Deadly Interrupt Effect
7527 triggered_spell_id = 32747;
7528 break;
7529 }
7530 // Item - Druid T10 Restoration 4P Bonus (Rejuvenation)
7531 case 70664:
7532 {
7533 // xinef: proc only from normal Rejuvenation, and proc rejuvenation
7534 if (!victim || !procSpell || procSpell->SpellIconID != 64)
7535 return false;
7536
7537 Player* caster = ToPlayer();
7538 if (!caster)
7539 return false;
7540 if (!caster->GetGroup() && victim == this)
7541 return false;
7542
7543 CastCustomSpell(70691, SPELLVALUE_BASE_POINT0, damage, victim, true);
7544 return true;
7545 }
7546 }
7547 // Eclipse
7548 if (dummySpell->SpellIconID == 2856 && IsPlayer())
7549 {
7550 if (!procSpell || effIndex != 0)
7551 return false;
7552
7553 bool isWrathSpell = (procSpell->SpellFamilyFlags[0] & 1);
7554
7555 if (!roll_chance_f(dummySpell->ProcChance * (isWrathSpell ? 0.6f : 1.0f)))
7556 return false;
7557
7558 target = this;
7559 if (target->HasAura(isWrathSpell ? 48517 : 48518))
7560 return false;
7561
7562 triggered_spell_id = isWrathSpell ? 48518 : 48517;
7563 break;
7564 }
7565 [[fallthrough]];
7566 }
7567 case SPELLFAMILY_ROGUE:
7568 {
7569 switch (dummySpell->Id)
7570 {
7571 // Glyph of Backstab
7572 case 56800:
7573 {
7574 if (victim)
7575 if (AuraEffect* aurEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x100000, 0, 0, GetGUID()))
7576 if (Aura* aur = aurEff->GetBase())
7577 if (!aur->IsRemoved() && aur->GetDuration() > 0)
7578 if ((aur->GetApplyTime() + aur->GetMaxDuration() / 1000 + 5) > (GameTime::GetGameTime().count() + aur->GetDuration() / 1000))
7579 {
7580 aur->SetDuration(aur->GetDuration() + 2000);
7581 return true;
7582 }
7583 return false;
7584 }
7585 // Deadly Throw Interrupt
7586 case 32748:
7587 {
7588 // Prevent cast Deadly Throw Interrupt on self from last effect (apply dummy) of Deadly Throw
7589 if (this == victim)
7590 return false;
7591
7592 triggered_spell_id = 32747;
7593 break;
7594 }
7595 }
7596 // Master of subtlety
7597 if (dummySpell->SpellIconID == 2114)
7598 {
7599 triggered_spell_id = 31665;
7600 basepoints0 = triggerAmount;
7601 break;
7602 }
7603 // Cut to the Chase
7604 if (dummySpell->SpellIconID == 2909)
7605 {
7606 // "refresh your Slice and Dice duration to its 5 combo point maximum"
7607 // lookup Slice and Dice
7608 if (AuraEffect const* aur = GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x40000, 0, 0))
7609 {
7610 aur->GetBase()->SetDuration(aur->GetSpellInfo()->GetMaxDuration(), true);
7611 return true;
7612 }
7613 return false;
7614 }
7615 // Deadly Brew
7616 else if (dummySpell->SpellIconID == 2963)
7617 {
7618 triggered_spell_id = 3409;
7619 break;
7620 }
7621 // Quick Recovery
7622 else if (dummySpell->SpellIconID == 2116)
7623 {
7624 if (!procSpell)
7625 return false;
7626
7627 // energy cost save
7628 basepoints0 = CalculatePct(int32(procSpell->ManaCost), triggerAmount);
7629 if (basepoints0 <= 0)
7630 return false;
7631
7632 target = this;
7633 triggered_spell_id = 31663;
7634 break;
7635 }
7636 break;
7637 }
7638 case SPELLFAMILY_HUNTER:
7639 {
7640 switch (dummySpell->SpellIconID)
7641 {
7642 case 2236: // Thrill of the Hunt
7643 {
7644 if (!procSpell)
7645 return false;
7646
7648
7649 // Disable charge drop because of Lock and Load
7650 if (spell)
7651 ToPlayer()->SetSpellModTakingSpell(spell, false);
7652
7653 // Explosive Shot
7654 if (procSpell->SpellFamilyFlags[2] & 0x200)
7655 {
7656 if (!victim)
7657 return false;
7658 if (AuraEffect const* pEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DUMMY, SPELLFAMILY_HUNTER, 0x0, 0x80000000, 0x0, GetGUID()))
7659 basepoints0 = pEff->GetSpellInfo()->CalcPowerCost(this, SpellSchoolMask(pEff->GetSpellInfo()->SchoolMask)) * 4 / 10 / 3;
7660 }
7661 else
7662 basepoints0 = procSpell->CalcPowerCost(this, SpellSchoolMask(procSpell->SchoolMask)) * 4 / 10;
7663
7664 if (spell)
7665 ToPlayer()->SetSpellModTakingSpell(spell, true);
7666
7667 if (basepoints0 <= 0)
7668 return false;
7669
7670 target = this;
7671 triggered_spell_id = 34720;
7672 break;
7673 }
7674 case 3406: // Hunting Party
7675 {
7676 triggered_spell_id = 57669;
7677 target = this;
7678 break;
7679 }
7680 case 3560: // Rapid Recuperation
7681 {
7682 // This effect only from Rapid Killing (mana regen)
7683 if (!(procSpell->SpellFamilyFlags[1] & 0x01000000))
7684 return false;
7685
7686 target = this;
7687
7688 switch (dummySpell->Id)
7689 {
7690 case 53228: // Rank 1
7691 triggered_spell_id = 56654;
7692 break;
7693 case 53232: // Rank 2
7694 triggered_spell_id = 58882;
7695 break;
7696 }
7697 break;
7698 }
7699 }
7700
7701 switch (dummySpell->Id)
7702 {
7703 case 57870: // Glyph of Mend Pet
7704 {
7705 if (!victim)
7706 return false;
7707
7708 victim->CastSpell(victim, 57894, true, nullptr, nullptr, GetGUID());
7709 return true;
7710 }
7711 }
7712 break;
7713 }
7715 {
7716 // Light's Beacon - Beacon of Light
7717 if (dummySpell->Id == 53651)
7718 {
7719 if (!victim)
7720 return false;
7721
7722 // Do not proc from Glyph of Holy Light and Judgement of Light
7723 if (procSpell->Id == 20267 || procSpell->Id == 54968)
7724 {
7725 return false;
7726 }
7727
7728 Unit* beaconTarget = triggeredByAura->GetBase()->GetCaster();
7729 if (!beaconTarget || beaconTarget == this || !beaconTarget->GetAura(53563, victim->GetGUID()))
7730 return false;
7731
7732 basepoints0 = int32(damage);
7733 triggered_spell_id = procSpell->IsRankOf(sSpellMgr->GetSpellInfo(635)) ? 53652 : 53654;
7734
7735 victim->CastCustomSpell(beaconTarget, triggered_spell_id, &basepoints0, nullptr, nullptr, true, 0, triggeredByAura, victim->GetGUID());
7736 return true;
7737 }
7738 // Judgements of the Wise
7739 if (dummySpell->SpellIconID == 3017)
7740 {
7741 target = this;
7742 triggered_spell_id = 31930;
7743 // replenishment
7744 CastSpell(this, 57669, true, castItem, triggeredByAura);
7745 break;
7746 }
7747 // Righteous Vengeance
7748 if (dummySpell->SpellIconID == 3025)
7749 {
7750 if (!victim)
7751 return false;
7752
7753 // 4 damage tick
7754 basepoints0 = triggerAmount * damage / 400;
7755 triggered_spell_id = 61840;
7756 // Add remaining ticks to damage done
7757 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
7758 return true;
7759 }
7760 // Sheath of Light
7761 if (dummySpell->SpellIconID == 3030)
7762 {
7763 // 4 healing tick
7764 basepoints0 = triggerAmount * damage / 400;
7765 triggered_spell_id = 54203;
7766 break;
7767 }
7768 switch (dummySpell->Id)
7769 {
7770 // Judgement of Light
7771 case 20185:
7772 {
7773 if (!victim || !victim->IsAlive() || victim->HasSpellCooldown(20267))
7774 return false;
7775
7776 auto* caster = triggeredByAura->GetBase()->GetCaster();
7777 if (!caster || !victim->IsFriendlyTo(caster))
7778 return false;
7779
7780 // 2% of base health
7781 basepoints0 = int32(victim->CountPctFromMaxHealth(2));
7782 victim->CastCustomSpell(victim, 20267, &basepoints0, 0, 0, true, 0, triggeredByAura);
7783 victim->AddSpellCooldown(20267, 0, 4 * IN_MILLISECONDS);
7784 return true;
7785 }
7786 // Judgement of Wisdom
7787 case 20186:
7788 {
7789 if (!victim || !victim->IsAlive() || !victim->HasActivePowerType(POWER_MANA) || victim->HasSpellCooldown(20268))
7790 return false;
7791
7792 auto* caster = triggeredByAura->GetBase()->GetCaster();
7793 if (!caster || !victim->IsFriendlyTo(caster))
7794 return false;
7795
7796 // 2% of base mana
7797 basepoints0 = int32(CalculatePct(victim->GetCreateMana(), 2));
7798 victim->CastCustomSpell(victim, 20268, &basepoints0, nullptr, nullptr, true, 0, triggeredByAura);
7799 victim->AddSpellCooldown(20268, 0, 4 * IN_MILLISECONDS);
7800 return true;
7801 }
7802 // Holy Power (Redemption Armor set)
7803 case 28789:
7804 {
7805 if (!victim)
7806 return false;
7807
7808 // Set class defined buff
7809 switch (victim->getClass())
7810 {
7811 case CLASS_PALADIN:
7812 case CLASS_PRIEST:
7813 case CLASS_SHAMAN:
7814 case CLASS_DRUID:
7815 triggered_spell_id = 28795; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d.
7816 break;
7817 case CLASS_MAGE:
7818 case CLASS_WARLOCK:
7819 triggered_spell_id = 28793; // Increases the friendly target's spell damage and healing by up to $s1 for $d.
7820 break;
7821 case CLASS_HUNTER:
7822 case CLASS_ROGUE:
7823 triggered_spell_id = 28791; // Increases the friendly target's attack power by $s1 for $d.
7824 break;
7825 case CLASS_WARRIOR:
7826 triggered_spell_id = 28790; // Increases the friendly target's armor
7827 break;
7828 default:
7829 return false;
7830 }
7831 break;
7832 }
7833 // Seal of Vengeance (damage calc on apply aura)
7834 case 31801:
7835 {
7836 if (effIndex != 0 || !victim) // effect 1, 2 used by seal unleashing code
7837 return false;
7838
7839 // At melee attack or Hammer of the Righteous spell damage considered as melee attack
7840 bool stacker = !procSpell || procSpell->Id == 53595;
7841 // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements
7842 bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39));
7843
7844 if (!stacker && !damager)
7845 return false;
7846
7847 triggered_spell_id = 31803;
7848
7849 if (Aura* aur = victim->GetAura(triggered_spell_id, GetGUID()))
7850 {
7851 if (aur->GetStackAmount() == 5)
7852 {
7853 if (stacker)
7854 aur->RefreshDuration();
7855 }
7856 }
7857
7858 CastSpell(victim, 42463, true, castItem, triggeredByAura); // Seal of Vengeance
7859
7860 if (!stacker)
7861 return false;
7862 break;
7863 }
7864 // Seal of Corruption
7865 case 53736:
7866 {
7867 if (effIndex != 0 || !victim) // effect 1, 2 used by seal unleashing code
7868 return false;
7869
7870 // At melee attack or Hammer of the Righteous spell damage considered as melee attack
7871 bool stacker = !procSpell || procSpell->Id == 53595;
7872 // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements
7873 bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39));
7874
7875 if (!stacker && !damager)
7876 return false;
7877
7878 triggered_spell_id = 53742;
7879
7880 if (Aura* aur = victim->GetAura(triggered_spell_id, GetGUID()))
7881 {
7882 if (aur->GetStackAmount() == 5)
7883 {
7884 if (stacker)
7885 aur->RefreshDuration();
7886 }
7887 }
7888
7889 CastSpell(victim, 53739, true, castItem, triggeredByAura); // Seal of Corruption
7890
7891 if (!stacker)
7892 return false;
7893 break;
7894 }
7895 // Spiritual Attunement
7896 case 31785:
7897 case 33776:
7898 {
7899 // if healed by another unit (victim)
7900 if (this == victim)
7901 return false;
7902
7903 // dont allow non-positive dots to proc
7904 if (!procSpell || !procSpell->IsPositive())
7905 return false;
7906
7907 HealInfo const* healInfo = eventInfo.GetHealInfo();
7908 if (!healInfo)
7909 {
7910 return false;
7911 }
7912
7913 uint32 effectiveHeal = healInfo->GetEffectiveHeal();
7914 if (effectiveHeal)
7915 {
7916 // heal amount
7917 basepoints0 = int32(CalculatePct(effectiveHeal, triggerAmount));
7918 target = this;
7919
7920 if (basepoints0)
7921 triggered_spell_id = 31786;
7922 }
7923 break;
7924 }
7925 // Paladin Tier 6 Trinket (Ashtongue Talisman of Zeal)
7926 case 40470:
7927 {
7928 if (!procSpell)
7929 return false;
7930
7931 float chance = 0.0f;
7932
7933 // Flash of light/Holy light
7934 if (procSpell->SpellFamilyFlags[0] & 0xC0000000)
7935 {
7936 triggered_spell_id = 40471;
7937 chance = 15.0f;
7938 }
7939 // Judgement (any)
7940 else if (procSpell->SpellFamilyFlags[0] & 0x800000)
7941 {
7942 triggered_spell_id = 40472;
7943 chance = 50.0f;
7944 }
7945 else
7946 return false;
7947
7948 if (!roll_chance_f(chance))
7949 return false;
7950
7951 break;
7952 }
7953 // Glyph of Holy Light
7954 case 54937:
7955 {
7956 triggered_spell_id = 54968;
7957 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7958 break;
7959 }
7960 // Item - Paladin T8 Holy 2P Bonus
7961 case 64890:
7962 {
7963 triggered_spell_id = 64891;
7964 basepoints0 = triggerAmount * damage / 300;
7965 break;
7966 }
7967 case 71406: // Tiny Abomination in a Jar
7968 case 71545: // Tiny Abomination in a Jar (Heroic)
7969 {
7970 if (!victim || !victim->IsAlive())
7971 return false;
7972
7973 CastSpell(this, 71432, true, nullptr, triggeredByAura);
7974
7975 Aura const* dummy = GetAura(71432);
7976 if (!dummy || dummy->GetStackAmount() < (dummySpell->Id == 71406 ? 8 : 7))
7977 return false;
7978
7979 RemoveAurasDueToSpell(71432);
7980 triggered_spell_id = 71433; // default main hand attack
7981 // roll if offhand
7982 if (Player const* player = ToPlayer())
7983 if (player->GetWeaponForAttack(OFF_ATTACK, true) && urand(0, 1))
7984 triggered_spell_id = 71434;
7985 target = victim;
7986 break;
7987 }
7988 // Item - Icecrown 25 Normal Dagger Proc
7989 case 71880:
7990 {
7991 switch (getPowerType())
7992 {
7993 case POWER_MANA:
7994 triggered_spell_id = 71881;
7995 break;
7996 case POWER_RAGE:
7997 triggered_spell_id = 71883;
7998 break;
7999 case POWER_ENERGY:
8000 triggered_spell_id = 71882;
8001 break;
8002 case POWER_RUNIC_POWER:
8003 triggered_spell_id = 71884;
8004 break;
8005 default:
8006 return false;
8007 }
8008 break;
8009 }
8010 // Item - Icecrown 25 Heroic Dagger Proc
8011 case 71892:
8012 {
8013 switch (getPowerType())
8014 {
8015 case POWER_MANA:
8016 triggered_spell_id = 71888;
8017 break;
8018 case POWER_RAGE:
8019 triggered_spell_id = 71886;
8020 break;
8021 case POWER_ENERGY:
8022 triggered_spell_id = 71887;
8023 break;
8024 case POWER_RUNIC_POWER:
8025 triggered_spell_id = 71885;
8026 break;
8027 default:
8028 return false;
8029 }
8030 break;
8031 }
8032 }
8033 break;
8034 }
8035 case SPELLFAMILY_SHAMAN:
8036 {
8037 switch (dummySpell->Id)
8038 {
8039 // Tidal Force
8040 case 55198:
8041 {
8042 // Remove aura stack from caster
8043 RemoveAuraFromStack(55166);
8044 // drop charges
8045 return false;
8046 }
8047 // Totemic Power (The Earthshatterer set)
8048 case 28823:
8049 {
8050 if (!victim)
8051 return false;
8052
8053 // Set class defined buff
8054 switch (victim->getClass())
8055 {
8056 case CLASS_PALADIN:
8057 case CLASS_PRIEST:
8058 case CLASS_SHAMAN:
8059 case CLASS_DRUID:
8060 triggered_spell_id = 28824; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d.
8061 break;
8062 case CLASS_MAGE:
8063 case CLASS_WARLOCK:
8064 triggered_spell_id = 28825; // Increases the friendly target's spell damage and healing by up to $s1 for $d.
8065 break;
8066 case CLASS_HUNTER:
8067 case CLASS_ROGUE:
8068 triggered_spell_id = 28826; // Increases the friendly target's attack power by $s1 for $d.
8069 break;
8070 case CLASS_WARRIOR:
8071 triggered_spell_id = 28827; // Increases the friendly target's armor
8072 break;
8073 default:
8074 return false;
8075 }
8076 break;
8077 }
8078 // Lesser Healing Wave (Totem of Flowing Water Relic)
8079 case 28849:
8080 {
8081 target = this;
8082 triggered_spell_id = 28850;
8083 break;
8084 }
8085 // Windfury Weapon (Passive) 1-8 Ranks
8086 case 33757:
8087 {
8088 Player* player = ToPlayer();
8089 if (!player || !castItem || !castItem->IsEquipped() || !victim || !victim->IsAlive())
8090 return false;
8091
8092 if (triggeredByAura->GetBase() && castItem->GetGUID() != triggeredByAura->GetBase()->GetCastItemGUID())
8093 return false;
8094
8095 WeaponAttackType attType = WeaponAttackType(player->GetAttackBySlot(castItem->GetSlot()));
8096 if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
8097 || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8098 || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK))
8099 return false;
8100
8101 // Now amount of extra power stored in 1 effect of Enchant spell
8102 // Get it by item enchant id
8103 uint32 spellId;
8105 {
8106 case 283:
8107 spellId = 8232;
8108 break; // 1 Rank
8109 case 284:
8110 spellId = 8235;
8111 break; // 2 Rank
8112 case 525:
8113 spellId = 10486;
8114 break; // 3 Rank
8115 case 1669:
8116 spellId = 16362;
8117 break; // 4 Rank
8118 case 2636:
8119 spellId = 25505;
8120 break; // 5 Rank
8121 case 3785:
8122 spellId = 58801;
8123 break; // 6 Rank
8124 case 3786:
8125 spellId = 58803;
8126 break; // 7 Rank
8127 case 3787:
8128 spellId = 58804;
8129 break; // 8 Rank
8130 default:
8131 {
8132 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non handled item enchantment (rank?) {} for spell id: {} (Windfury)",
8133 castItem->GetEnchantmentId(EnchantmentSlot(TEMP_ENCHANTMENT_SLOT)), dummySpell->Id);
8134 return false;
8135 }
8136 }
8137
8138 SpellInfo const* windfurySpellInfo = sSpellMgr->GetSpellInfo(spellId);
8139 if (!windfurySpellInfo)
8140 {
8141 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non-existing spell id: {} (Windfury)", spellId);
8142 return false;
8143 }
8144
8145 int32 extra_attack_power = CalculateSpellDamage(victim, windfurySpellInfo, 1);
8146
8147 // Value gained from additional AP
8148 basepoints0 = int32(extra_attack_power / 14.0f * GetAttackTime(attType) / 1000);
8149
8150 if (procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
8151 triggered_spell_id = 25504;
8152
8153 if (procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8154 triggered_spell_id = 33750;
8155
8156 // custom cooldown processing case
8157 if (player->HasSpellCooldown(dummySpell->Id))
8158 return false;
8159
8160 // apply cooldown before cast to prevent processing itself
8161 player->AddSpellCooldown(dummySpell->Id, 0, 3 * IN_MILLISECONDS);
8162
8163 // Attack Twice
8164 for (uint32 i = 0; i < 2; ++i)
8165 CastCustomSpell(victim, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
8166
8167 return true;
8168 }
8169 // Shaman Tier 6 Trinket
8170 case 40463:
8171 {
8172 if (!procSpell)
8173 return false;
8174
8175 float chance;
8176 if (procSpell->SpellFamilyFlags[0] & 0x1)
8177 {
8178 triggered_spell_id = 40465; // Lightning Bolt
8179 chance = 15.0f;
8180 }
8181 else if (procSpell->SpellFamilyFlags[0] & 0x80)
8182 {
8183 triggered_spell_id = 40465; // Lesser Healing Wave
8184 chance = 10.0f;
8185 }
8186 else if (procSpell->SpellFamilyFlags[1] & 0x00000010)
8187 {
8188 triggered_spell_id = 40466; // Stormstrike
8189 chance = 50.0f;
8190 }
8191 else
8192 return false;
8193
8194 if (!roll_chance_f(chance))
8195 return false;
8196
8197 target = this;
8198 break;
8199 }
8200 // Glyph of Healing Wave
8201 case 55440:
8202 {
8203 // Not proc from self heals
8204 if (this == victim)
8205 return false;
8206 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8207 target = this;
8208 triggered_spell_id = 55533;
8209 break;
8210 }
8211 // Spirit Hunt
8212 case 58877:
8213 {
8214 // Cast on owner
8215 target = GetOwner();
8216 if (!target)
8217 return false;
8218 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8219 triggered_spell_id = 58879;
8220 // Heal wolf
8221 CastCustomSpell(this, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8222 break;
8223 }
8224 // Shaman T9 Elemental 4P Bonus
8225 case 67228:
8226 {
8227 // Lava Burst
8228 if (procSpell->SpellFamilyFlags[1] & 0x1000)
8229 {
8230 triggered_spell_id = 71824;
8231 SpellInfo const* triggeredSpell = sSpellMgr->GetSpellInfo(triggered_spell_id);
8232 if (!triggeredSpell)
8233 return false;
8234 basepoints0 = CalculatePct(int32(damage), triggerAmount) / (triggeredSpell->GetMaxDuration() / triggeredSpell->Effects[0].Amplitude);
8235 }
8236 break;
8237 }
8238 // Item - Shaman T10 Elemental 4P Bonus
8239 case 70817:
8240 {
8241 if (!target)
8242 return false;
8243 // try to find spell Flame Shock on the target
8244 if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0x0, 0x0, GetGUID()))
8245 {
8246 Aura* flameShock = aurEff->GetBase();
8247 int32 extraTime = 2 * aurEff->GetAmplitude();
8248 flameShock->SetMaxDuration(flameShock->GetMaxDuration() + extraTime);
8249 flameShock->SetDuration(flameShock->GetDuration() + extraTime);
8250
8251 return true;
8252 }
8253 // if not found Flame Shock
8254 return false;
8255 }
8256 break;
8257 }
8258 // Frozen Power
8259 if (dummySpell->SpellIconID == 3780)
8260 {
8261 if (!target)
8262 return false;
8263 if (GetDistance(target) < 15.0f)
8264 return false;
8265 float chance = (float)triggerAmount;
8266 if (!roll_chance_f(chance))
8267 return false;
8268
8269 triggered_spell_id = 63685;
8270 break;
8271 }
8272 // Ancestral Awakening
8273 if (dummySpell->SpellIconID == 3065)
8274 {
8275 triggered_spell_id = 52759;
8276 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8277 target = this;
8278 break;
8279 }
8280 // Flametongue Weapon (Passive)
8281 if (dummySpell->SpellFamilyFlags[0] & 0x200000)
8282 {
8283 if (!IsPlayer() || !victim || !victim->IsAlive() || !castItem || !castItem->IsEquipped())
8284 return false;
8285
8287 if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
8288 || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8289 || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK))
8290 return false;
8291
8292 float fire_onhit = float(CalculatePct(dummySpell->Effects[EFFECT_0]. CalcValue(), 1.0f));
8293
8294 float add_spellpower = (float)(SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE)
8296
8297 // 1.3speed = 5%, 2.6speed = 10%, 4.0 speed = 15%, so, 1.0speed = 3.84%
8298 ApplyPct(add_spellpower, 3.84f);
8299
8300 // Enchant on Off-Hand and ready?
8301 if (castItem->GetSlot() == EQUIPMENT_SLOT_OFFHAND && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8302 {
8303 float BaseWeaponSpeed = GetAttackTime(OFF_ATTACK) / 1000.0f;
8304
8305 // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed
8306 basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed));
8307 triggered_spell_id = 10444;
8308 }
8309
8310 // Enchant on Main-Hand and ready?
8311 else if (castItem->GetSlot() == EQUIPMENT_SLOT_MAINHAND && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
8312 {
8313 float BaseWeaponSpeed = GetAttackTime(BASE_ATTACK) / 1000.0f;
8314
8315 // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed
8316 basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed));
8317 triggered_spell_id = 10444;
8318 }
8319
8320 // If not ready, we should return, shouldn't we?!
8321 else
8322 return false;
8323
8324 CastCustomSpell(victim, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
8325 return true;
8326 }
8327 // Improved Water Shield
8328 if (dummySpell->SpellIconID == 2287)
8329 {
8330 if (!procSpell)
8331 return false;
8332
8333 // Default chance for Healing Wave and Riptide
8334 float chance = (float)triggeredByAura->GetAmount();
8335
8336 if (procSpell->SpellFamilyFlags[0] & 0x80)
8337 // Lesser Healing Wave - 0.6 of default
8338 chance *= 0.6f;
8339 else if (procSpell->SpellFamilyFlags[0] & 0x100)
8340 // Chain heal - 0.3 of default
8341 chance *= 0.3f;
8342
8343 if (!roll_chance_f(chance))
8344 return false;
8345
8346 // Water Shield
8347 if (AuraEffect const* aurEff = GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_SHAMAN, 0, 0x00000020, 0))
8348 {
8349 uint32 spell = aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell;
8350 CastSpell(this, spell, true, castItem, triggeredByAura);
8351 return true;
8352 }
8353 return false;
8354 }
8355 // Lightning Overload
8356 if (dummySpell->SpellIconID == 2018) // only this spell have SpellFamily Shaman SpellIconID == 2018 and dummy aura
8357 {
8358 if (!procSpell || !IsPlayer() || !victim)
8359 return false;
8360
8361 if (procEx & PROC_EX_CRITICAL_HIT)
8362 damage /= 2;
8363
8364 // do not proc off from itself
8365 if (procSpell->Id == 45297 || procSpell->Id == 45284)
8366 {
8367 return false;
8368 }
8369
8370 do
8371 {
8372 uint32 spell = 0;
8373
8374 if (procSpell->SpellFamilyFlags[0] & 0x2)
8375 {
8376 // 1/3 of 33% if 11%
8377 if (!roll_chance_i(33))
8378 return false;
8379
8380 spell = 45297;
8381 }
8382 else
8383 spell = 45284;
8384
8385 // do not reduce damage-spells have correct basepoints
8386 damage /= 2;
8387 int32 dmg = damage;
8388
8389 // Cast
8390 CastCustomSpell(victim, spell, &dmg, 0, 0, true, castItem, triggeredByAura);
8391 } while (roll_chance_i(33));
8392 return true;
8393 }
8394 // Static Shock
8395 if (dummySpell->SpellIconID == 3059)
8396 {
8397 // Lightning Shield
8399 {
8400 uint32 spell = sSpellMgr->GetSpellWithRank(26364, aurEff->GetSpellInfo()->GetRank());
8401 CastSpell(target, spell, true, castItem, triggeredByAura);
8402 aurEff->GetBase()->DropCharge();
8403 return true;
8404 }
8405 return false;
8406 }
8407 break;
8408 }
8410 {
8411 // Improved Blood Presence
8412 if (dummySpell->SpellIconID == 2636)
8413 {
8414 if (!IsPlayer())
8415 return false;
8416 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8417 break;
8418 }
8419 // Butchery
8420 if (dummySpell->SpellIconID == 2664)
8421 {
8422 basepoints0 = triggerAmount;
8423 triggered_spell_id = 50163;
8424 target = this;
8425 break;
8426 }
8427 // Mark of Blood
8428 if (dummySpell->Id == 49005)
8429 {
8431 triggered_spell_id = 61607;
8432 break;
8433 }
8434 // Unholy Blight
8435 if (dummySpell->Id == 49194)
8436 {
8437 triggered_spell_id = 50536;
8438 SpellInfo const* unholyBlight = sSpellMgr->GetSpellInfo(triggered_spell_id);
8439 if (!unholyBlight || !victim)
8440 return false;
8441
8442 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8443
8444 //Glyph of Unholy Blight
8445 if (AuraEffect* glyph = GetAuraEffect(63332, 0))
8446 AddPct(basepoints0, glyph->GetAmount());
8447
8448 basepoints0 = basepoints0 / (unholyBlight->GetMaxDuration() / unholyBlight->Effects[0].Amplitude);
8449 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
8450 return true;
8451 }
8452 // Vendetta
8453 if (dummySpell->SpellFamilyFlags[0] & 0x10000)
8454 {
8455 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
8456 triggered_spell_id = 50181;
8457 target = this;
8458 break;
8459 }
8460 // Necrosis
8461 if (dummySpell->SpellIconID == 2709)
8462 {
8463 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8464 triggered_spell_id = 51460;
8465 break;
8466 }
8467 // Threat of Thassarian
8468 if (dummySpell->SpellIconID == 2023)
8469 {
8470 // Must Dual Wield
8471 if (!procSpell || !HasOffhandWeaponForAttack())
8472 return false;
8473 // Chance as basepoints for dummy aura
8474 if (!roll_chance_i(triggerAmount))
8475 return false;
8476
8477 switch (procSpell->Id)
8478 {
8479 // Obliterate
8480 case 49020:
8481 triggered_spell_id = 66198;
8482 break; // Rank 1
8483 case 51423:
8484 triggered_spell_id = 66972;
8485 break; // Rank 2
8486 case 51424:
8487 triggered_spell_id = 66973;
8488 break; // Rank 3
8489 case 51425:
8490 triggered_spell_id = 66974;
8491 break; // Rank 4
8492
8493 // Frost Strike
8494 case 49143:
8495 triggered_spell_id = 66196;
8496 break; // Rank 1
8497 case 51416:
8498 triggered_spell_id = 66958;
8499 break; // Rank 2
8500 case 51417:
8501 triggered_spell_id = 66959;
8502 break; // Rank 3
8503 case 51418:
8504 triggered_spell_id = 66960;
8505 break; // Rank 4
8506 case 51419:
8507 triggered_spell_id = 66961;
8508 break; // Rank 5
8509 case 55268:
8510 triggered_spell_id = 66962;
8511 break; // Rank 6
8512
8513 // Plague Strike
8514 case 45462:
8515 triggered_spell_id = 66216;
8516 break; // Rank 1
8517 case 49917:
8518 triggered_spell_id = 66988;
8519 break; // Rank 2
8520 case 49918:
8521 triggered_spell_id = 66989;
8522 break; // Rank 3
8523 case 49919:
8524 triggered_spell_id = 66990;
8525 break; // Rank 4
8526 case 49920:
8527 triggered_spell_id = 66991;
8528 break; // Rank 5
8529 case 49921:
8530 triggered_spell_id = 66992;
8531 break; // Rank 6
8532
8533 // Death Strike
8534 case 49998:
8535 triggered_spell_id = 66188;
8536 break; // Rank 1
8537 case 49999:
8538 triggered_spell_id = 66950;
8539 break; // Rank 2
8540 case 45463:
8541 triggered_spell_id = 66951;
8542 break; // Rank 3
8543 case 49923:
8544 triggered_spell_id = 66952;
8545 break; // Rank 4
8546 case 49924:
8547 triggered_spell_id = 66953;
8548 break; // Rank 5
8549
8550 // Rune Strike
8551 case 56815:
8552 triggered_spell_id = 66217;
8553 break; // Rank 1
8554
8555 // Blood Strike
8556 case 45902:
8557 triggered_spell_id = 66215;
8558 break; // Rank 1
8559 case 49926:
8560 triggered_spell_id = 66975;
8561 break; // Rank 2
8562 case 49927:
8563 triggered_spell_id = 66976;
8564 break; // Rank 3
8565 case 49928:
8566 triggered_spell_id = 66977;
8567 break; // Rank 4
8568 case 49929:
8569 triggered_spell_id = 66978;
8570 break; // Rank 5
8571 case 49930:
8572 triggered_spell_id = 66979;
8573 break; // Rank 6
8574 default:
8575 return false;
8576 }
8577
8578 // This should do, restore spell mod so next attack can also use this!
8579 // crit chance for first strike is already computed
8580 ToPlayer()->RestoreSpellMods(m_currentSpells[CURRENT_GENERIC_SPELL], 51124, nullptr); // Killing Machine
8581 ToPlayer()->RestoreSpellMods(m_currentSpells[CURRENT_GENERIC_SPELL], 49796, nullptr); // Deathchill
8582
8583 // Xinef: Somehow basepoints are divided by 2 which is later divided by 2 (offhand multiplier)
8584 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
8585 if (triggerEntry->SchoolMask & SPELL_SCHOOL_MASK_NORMAL)
8586 basepoints0 = triggerEntry->Effects[EFFECT_0].BasePoints * 2;
8587
8588 SetCantProc(true);
8589 if (basepoints0)
8590 CastCustomSpell(target, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8591 else
8592 CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
8593 SetCantProc(false);
8594 return true;
8595 }
8596 // Runic Power Back on Snare/Root
8597 if (dummySpell->Id == 61257)
8598 {
8599 // only for spells and hit/crit (trigger start always) and not start from self casted spells
8600 if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
8601 return false;
8602 // Need snare or root mechanic
8603 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_SNARE))))
8604 return false;
8605 triggered_spell_id = 61258;
8606 target = this;
8607 break;
8608 }
8609 // Sudden Doom
8610 if (dummySpell->SpellIconID == 1939 && IsPlayer())
8611 {
8612 SpellChainNode const* chain = nullptr;
8613 // get highest rank of the Death Coil spell
8614 PlayerSpellMap const& sp_list = ToPlayer()->GetSpellMap();
8615 for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr)
8616 {
8617 // check if shown in spell book
8618 if (!itr->second->Active || !itr->second->IsInSpec(ToPlayer()->GetActiveSpec()) || itr->second->State == PLAYERSPELL_REMOVED)
8619 continue;
8620
8621 SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(itr->first);
8622 if (!spellProto)
8623 continue;
8624
8625 if (spellProto->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT
8626 && spellProto->SpellFamilyFlags[0] & 0x2000)
8627 {
8628 SpellChainNode const* newChain = sSpellMgr->GetSpellChainNode(itr->first);
8629
8630 // No chain entry or entry lower than found entry
8631 if (!chain || !newChain || (chain->rank < newChain->rank))
8632 {
8633 triggered_spell_id = itr->first;
8634 chain = newChain;
8635 }
8636 else
8637 continue;
8638 // Found spell is last in chain - do not need to look more
8639 // Optimisation for most common case
8640 if (chain && chain->last->Id == itr->first)
8641 break;
8642 }
8643 }
8644 }
8645 break;
8646 }
8647 case SPELLFAMILY_POTION:
8648 {
8649 // alchemist's stone
8650 if (dummySpell->Id == 17619)
8651 {
8652 if (procSpell->SpellFamilyName == SPELLFAMILY_POTION)
8653 {
8654 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; i++)
8655 {
8656 if (procSpell->Effects[i].Effect == SPELL_EFFECT_HEAL)
8657 {
8658 triggered_spell_id = 21399;
8659 }
8660 else if (procSpell->Effects[i].Effect == SPELL_EFFECT_ENERGIZE)
8661 {
8662 triggered_spell_id = 21400;
8663 }
8664 else
8665 continue;
8666
8667 basepoints0 = int32(CalculateSpellDamage(this, procSpell, i) * 0.4f);
8668 CastCustomSpell(this, triggered_spell_id, &basepoints0, nullptr, nullptr, true, nullptr, triggeredByAura);
8669 }
8670 return true;
8671 }
8672 }
8673 break;
8674 }
8675 case SPELLFAMILY_PET:
8676 {
8677 switch (dummySpell->SpellIconID)
8678 {
8679 // Guard Dog
8680 case 201:
8681 {
8682 if (!victim)
8683 return false;
8684
8685 triggered_spell_id = 54445;
8686 target = this;
8687 float addThreat = float(CalculatePct(procSpell->Effects[0].CalcValue(this), triggerAmount));
8688 victim->AddThreat(this, addThreat);
8689 break;
8690 }
8691 // Silverback
8692 case 1582:
8693 triggered_spell_id = dummySpell->Id == 62765 ? 62801 : 62800;
8694 target = this;
8695 break;
8696 }
8697 break;
8698 }
8699 default:
8700 break;
8701 }
8702
8703 // if not handled by custom case, get triggered spell from dummySpell proto
8704 if (!triggered_spell_id)
8705 triggered_spell_id = dummySpell->Effects[triggeredByAura->GetEffIndex()].TriggerSpell;
8706
8707 // processed charge only counting case
8708 if (!triggered_spell_id)
8709 return true;
8710
8711 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
8712 if (!triggerEntry)
8713 {
8714 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: Spell {} has non-existing triggered spell {}", dummySpell->Id, triggered_spell_id);
8715 return false;
8716 }
8717
8718 if (cooldown_spell_id == 0)
8719 cooldown_spell_id = triggered_spell_id;
8720
8721 if (cooldown)
8722 {
8723 if (HasSpellCooldown(cooldown_spell_id))
8724 return false;
8725
8726 AddSpellCooldown(cooldown_spell_id, 0, cooldown);
8727 }
8728
8729 if (basepoints0)
8730 CastCustomSpell(target, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8731 else
8732 CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
8733
8734 return true;
8735}
constexpr auto IN_MILLISECONDS
Definition: Common.h:53
int32 irand(int32 min, int32 max)
Definition: Random.cpp:37
T ApplyPct(T &base, U pct)
Definition: Util.h:73
@ SPELL_EFFECT_ENERGIZE
Definition: SharedDefines.h:808
@ LANG_UNIVERSAL
Definition: SharedDefines.h:735
@ CLASS_DRUID
Definition: SharedDefines.h:151
@ CLASS_SHAMAN
Definition: SharedDefines.h:147
@ CLASS_PRIEST
Definition: SharedDefines.h:145
@ CLASS_WARLOCK
Definition: SharedDefines.h:149
@ CLASS_MAGE
Definition: SharedDefines.h:148
@ CLASS_PALADIN
Definition: SharedDefines.h:142
@ CLASS_ROGUE
Definition: SharedDefines.h:144
@ MECHANIC_STUN
Definition: SharedDefines.h:1337
@ MECHANIC_ROOT
Definition: SharedDefines.h:1332
@ MECHANIC_SNARE
Definition: SharedDefines.h:1336
@ SPELLFAMILY_WARLOCK
Definition: SharedDefines.h:3533
@ SPELLFAMILY_PALADIN
Definition: SharedDefines.h:3538
@ SPELLFAMILY_HUNTER
Definition: SharedDefines.h:3537
@ SPELLFAMILY_POTION
Definition: SharedDefines.h:3541
@ SPELLFAMILY_ROGUE
Definition: SharedDefines.h:3536
@ SPELLFAMILY_DRUID
Definition: SharedDefines.h:3535
@ SPELLFAMILY_PET
Definition: SharedDefines.h:3545
@ REP_EXALTED
Definition: SharedDefines.h:187
@ SPELL_SCHOOL_MASK_SHADOW
Definition: SharedDefines.h:302
@ SPELL_SCHOOL_MASK_FIRE
Definition: SharedDefines.h:299
@ SPELL_SCHOOL_MASK_FROST
Definition: SharedDefines.h:301
static First const & RAND(First const &first, Second const &second, Rest const &... rest)
Definition: CreatureAIImpl.h:25
@ SPELL_AURA_PROC_TRIGGER_SPELL
Definition: SpellAuraDefines.h:105
@ SPELL_AURA_HASTE_SPELLS
Definition: SpellAuraDefines.h:279
@ SPELL_AURA_MOD_MELEE_HASTE
Definition: SpellAuraDefines.h:201
@ SPELL_AURA_MOD_DECREASE_SPEED
Definition: SpellAuraDefines.h:96
@ SPELL_AURA_PERIODIC_DUMMY
Definition: SpellAuraDefines.h:289
@ PROC_EX_INTERNAL_HOT
Definition: SpellMgr.h:220
@ PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS
Definition: SpellMgr.h:128
@ PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS
Definition: SpellMgr.h:122
std::map< uint32, SpellCooldown > SpellCooldowns
Definition: Player.h:208
std::unordered_map< uint32, PlayerSpell * > PlayerSpellMap
Definition: Player.h:193
@ EQUIPMENT_SLOT_MAINHAND
Definition: Player.h:690
@ PLAYERSPELL_REMOVED
Definition: Player.h:122
EnchantmentSlot
Definition: Item.h:168
@ TEMP_ENCHANTMENT_SLOT
Definition: Item.h:170
WeaponAttackType
Definition: Unit.h:208
uint8 GetSlot() const
Definition: Item.h:281
uint32 GetEnchantmentId(EnchantmentSlot slot) const
Definition: Item.h:304
bool IsEquipped() const
Definition: Item.cpp:789
void SetSpellModTakingSpell(Spell *spell, bool apply)
Definition: Player.cpp:10087
void RestoreSpellMods(Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
Definition: Player.cpp:9945
bool HasSpellCooldown(uint32 spell_id) const override
Definition: Player.cpp:16339
PlayerSpellMap const & GetSpellMap() const
Definition: Player.h:1759
void AddSpellCooldown(uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
Definition: Player.cpp:11095
SpellCooldowns GetSpellCooldowns() const
Definition: Player.h:2151
static uint8 GetAttackBySlot(uint8 slot)
Definition: PlayerStorage.cpp:542
ReputationRank GetReputationRank(uint32 faction_id) const
Definition: Player.cpp:5871
Unit * GetSelectedUnit() const
Definition: Player.cpp:11546
void RemoveSpellCooldown(uint32 spell_id, bool update=false)
Definition: Player.cpp:3514
void Say(std::string_view text, Language language, WorldObject const *=nullptr) override
Handles said message in regular chat based on declared language and in config pre-defined Range.
Definition: Player.cpp:9348
Item * GetItemByGuid(ObjectGuid guid) const
Definition: PlayerStorage.cpp:407
Spell * m_spellModTakingSpell
Definition: Player.h:2535
Definition: Unit.h:373
uint32 GetEffectiveHeal() const
Definition: Unit.h:413
uint32 GetCreatePowers(Powers power) const
Definition: Unit.cpp:15660
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition: Unit.cpp:5581
void RemoveAurasWithMechanic(uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
Definition: Unit.cpp:5253
int32 CalculateSpellDamage(Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
Definition: Unit.cpp:14851
void SetCantProc(bool apply)
Definition: Unit.cpp:17287
bool HealthBelowPct(int32 pct) const
Definition: Unit.h:1037
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4909
int32 SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask, bool isDoT=false)
Definition: Unit.cpp:11975
bool IsFriendlyTo(Unit const *unit) const
Definition: Unit.cpp:10241
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition: Unit.cpp:11937
uint32 CountPctFromMaxHealth(int32 pct) const
Definition: Unit.h:1042
void CastDelayedSpellWithPeriodicAmount(Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
Definition: Unit.cpp:20307
Powers getPowerType() const
Definition: Unit.h:1052
void RemoveMovementImpairingAuras(bool withRoot)
Definition: Unit.cpp:5234
void SetMaxDuration(int32 duration)
Definition: SpellAuras.h:130
SpellInfo const * GetSpellInfo() const
Definition: Spell.h:578
int32 GetPowerCost() const
Definition: Spell.h:579
int32 GetMaxDuration() const
Definition: SpellInfo.cpp:2345
uint32 ProcChance
Definition: SpellInfo.h:356
Definition: SpellMgr.h:554
SpellInfo const * last
Definition: SpellMgr.h:558
uint8 rank
Definition: SpellMgr.h:559

References AddPct(), Player::AddSpellCooldown(), AddSpellCooldown(), AddThreat(), ApplyPct(), AURA_REMOVE_BY_ENEMY_SPELL, BASE_ATTACK, SpellInfo::CalcPowerCost(), CalculatePct(), CalculateSpellDamage(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, CountPctFromMaxHealth(), CURRENT_GENERIC_SPELL, EFFECT_0, EFFECT_1, SpellInfo::Effects, ObjectGuid::Empty, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, SpellInfo::EquippedItemClass, SpellInfo::GetAllEffectsMechanicMask(), AuraEffect::GetAmount(), Player::GetAttackBySlot(), GetAttackTime(), GetAura(), GetAuraEffect(), GetAuraEffectsByType(), AuraEffect::GetBase(), AuraEffect::GetCaster(), Aura::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCastItemGUID(), Aura::GetCharges(), getClass(), GetCreateMana(), GetCreatePowers(), WorldObject::GetDistance(), Aura::GetDuration(), Aura::GetEffect(), HealInfo::GetEffectiveHeal(), AuraEffect::GetEffIndex(), Item::GetEnchantmentId(), GameTime::GetGameTime(), Player::GetGroup(), GetGuardianPet(), Object::GetGUID(), ProcEventInfo::GetHealInfo(), Player::GetItemByGuid(), Aura::GetMaxDuration(), SpellInfo::GetMaxDuration(), GetMaxPower(), GetOwner(), Spell::GetPowerCost(), getPowerType(), ProcEventInfo::GetProcSpell(), Player::GetReputationRank(), SpellInfo::GetSchoolMask(), Player::GetSelectedUnit(), Item::GetSlot(), Player::GetSpellCooldowns(), AuraEffect::GetSpellInfo(), Player::GetSpellMap(), Aura::GetStackAmount(), GetVictim(), HasActivePowerType(), HasAura(), Position::HasInArc(), HasOffhandWeaponForAttack(), Player::HasSpellCooldown(), HasSpellCooldown(), HealthBelowPct(), SpellInfo::Id, IN_MILLISECONDS, irand(), IsAlive(), Object::IsCreature(), Item::IsEquipped(), IsFriendlyTo(), Object::IsPlayer(), SpellInfo::IsPositive(), SpellInfo::IsRankOf(), LANG_UNIVERSAL, SpellChainNode::last, LOG_ERROR, m_currentSpells, Player::m_spellModTakingSpell, SpellInfo::ManaCost, MAX_SPELL_EFFECTS, MECHANIC_ROOT, MECHANIC_SNARE, MECHANIC_STUN, OFF_ATTACK, PLAYERSPELL_REMOVED, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, PROC_EX_CRITICAL_HIT, PROC_EX_INTERNAL_HOT, PROC_EX_NORMAL_HIT, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS, SpellInfo::ProcChance, RAND(), SpellChainNode::rank, RemoveAura(), RemoveAuraFromStack(), RemoveAurasByType(), RemoveAurasDueToSpell(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), Player::RemoveSpellCooldown(), REP_EXALTED, Player::RestoreSpellMods(), roll_chance_f(), roll_chance_i(), Player::Say(), SpellInfo::SchoolMask, AuraEffect::SetAmount(), SetCantProc(), Aura::SetDuration(), Aura::SetMaxDuration(), Player::SetSpellModTakingSpell(), SPELL_AURA_DUMMY, SPELL_AURA_HASTE_SPELLS, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_MELEE_HASTE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_DUMMY, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_LEECH, SPELL_AURA_PROC_TRIGGER_SPELL, SPELL_EFFECT_ENERGIZE, SPELL_EFFECT_HEAL, SPELL_SCHOOL_MASK_FIRE, SPELL_SCHOOL_MASK_FROST, SPELL_SCHOOL_MASK_NORMAL, SPELL_SCHOOL_MASK_SHADOW, SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PET, SPELLFAMILY_POTION, SPELLFAMILY_PRIEST, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARLOCK, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SPELLVALUE_BASE_POINT0, SpellInfo::SpellVisual, sSpellMgr, TEMP_ENCHANTMENT_SLOT, Object::ToPlayer(), and urand().

Referenced by ProcDamageAndSpellFor().

◆ HandleEmoteCommand()

void Unit::HandleEmoteCommand ( uint32  emoteId)
2001{
2003 packet.EmoteID = emoteId;
2004 packet.Guid = GetGUID();
2005 SendMessageToSet(packet.Write(), true);
2006}
Definition: ChatPackets.h:29
WorldPacket const * Write() override
Definition: ChatPackets.cpp:20
uint32 EmoteID
Definition: ChatPackets.h:35
ObjectGuid Guid
Definition: ChatPackets.h:36

References WorldPackets::Chat::Emote::EmoteID, Object::GetGUID(), WorldPackets::Chat::Emote::Guid, WorldObject::SendMessageToSet(), and WorldPackets::Chat::Emote::Write().

Referenced by npc_mograine::npc_mograineAI::AshbringerEvent(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), boss_viscidus::DamageTaken(), DealMeleeDamage(), boss_twinemperorsAI::DoAction(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), StandUpEvent::Execute(), PartyTimeEmoteEvent::Execute(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), WorldSession::HandleEmoteOpcode(), npc_commandscript::HandleNpcSayCommand(), npc_commandscript::HandleNpcYellCommand(), WorldSession::HandleTextEmoteOpcode(), npc_maiev_illidan::IsSummonedBy(), npc_akama_illidan::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), npc_sentinel_leader::MovementInform(), npc_sentinel_infiltrator::MovementInform(), npc_fos_leader_second::npc_fos_leader_secondAI::MovementInform(), boss_illidan_stormrage::MovementInform(), npc_akama_illidan::MovementInform(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::MovementInform(), boss_felmyst::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), spell_gen_spectator_cheer_trigger::PrepareSpellScript(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), PetAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_thekal::Reset(), npc_zealot_lorkhan::Reset(), npc_zealot_zath::Reset(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), boss_felmyst::ScheduleFlightSequence(), boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), CreatureTextMgr::SendEmote(), boss_grand_warlock_nethekurse::SetData(), npc_harrison_jones::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_felmyst::StartIntro(), boss_ahune::Submerge(), boss_nightbane::TriggerHealthTakeOff(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_partygoer::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_forest_frog::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_shenthul::npc_shenthulAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_highlord_tirion_fordring_lh::npc_highlord_tirion_fordringAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_valiance_keep_cannoneer::npc_valiance_keep_cannoneerAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_dancing_flames::npc_dancing_flamesAI::UpdateAI(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::UpdateAI(), npc_rocknot::npc_rocknotAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), npc_taretha::npc_tarethaAI::WaypointReached(), npc_general_andorov::WaypointReached(), npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached(), npc_engineer_helice::npc_engineer_heliceAI::WaypointReached(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::WaypointReached(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ HandleOverrideClassScriptAuraProc()

bool Unit::HandleOverrideClassScriptAuraProc ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  cooldown 
)
private
9862{
9863 int32 scriptId = triggeredByAura->GetMiscValue();
9864
9865 if (!victim || !victim->IsAlive())
9866 return false;
9867
9868 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
9869 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
9870
9871 uint32 triggered_spell_id = 0;
9872
9873 switch (scriptId)
9874 {
9875 case 836: // Improved Blizzard (Rank 1)
9876 {
9877 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9878 return false;
9879 triggered_spell_id = 12484;
9880 break;
9881 }
9882 case 988: // Improved Blizzard (Rank 2)
9883 {
9884 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9885 return false;
9886 triggered_spell_id = 12485;
9887 break;
9888 }
9889 case 989: // Improved Blizzard (Rank 3)
9890 {
9891 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9892 return false;
9893 triggered_spell_id = 12486;
9894 break;
9895 }
9896 case 4533: // Dreamwalker Raiment 2 pieces bonus
9897 {
9898 // Chance 50%
9899 if (!roll_chance_i(50))
9900 return false;
9901
9902 switch (victim->getPowerType())
9903 {
9904 case POWER_MANA:
9905 triggered_spell_id = 28722;
9906 break;
9907 case POWER_RAGE:
9908 triggered_spell_id = 28723;
9909 break;
9910 case POWER_ENERGY:
9911 triggered_spell_id = 28724;
9912 break;
9913 default:
9914 return false;
9915 }
9916 break;
9917 }
9918 case 4537: // Dreamwalker Raiment 6 pieces bonus
9919 triggered_spell_id = 28750; // Blessing of the Claw
9920 break;
9921 case 5497: // Improved Mana Gems
9922 triggered_spell_id = 37445; // Mana Surge
9923 break;
9924 case 7010: // Revitalize - can proc on full hp target
9925 case 7011:
9926 case 7012:
9927 {
9928 if (!roll_chance_i(triggeredByAura->GetAmount()))
9929 return false;
9930 switch (victim->getPowerType())
9931 {
9932 case POWER_MANA:
9933 triggered_spell_id = 48542;
9934 break;
9935 case POWER_RAGE:
9936 triggered_spell_id = 48541;
9937 break;
9938 case POWER_ENERGY:
9939 triggered_spell_id = 48540;
9940 break;
9941 case POWER_RUNIC_POWER:
9942 triggered_spell_id = 48543;
9943 break;
9944 default:
9945 break;
9946 }
9947 break;
9948 }
9949 default:
9950 break;
9951 }
9952
9953 // not processed
9954 if (!triggered_spell_id)
9955 return false;
9956
9957 // standard non-dummy case
9958 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
9959
9960 if (!triggerEntry)
9961 {
9962 LOG_ERROR("entities.unit", "Unit::HandleOverrideClassScriptAuraProc: Spell {} triggering for class script id {}", triggered_spell_id, scriptId);
9963 return false;
9964 }
9965
9966 if (cooldown)
9967 {
9968 if (HasSpellCooldown(triggered_spell_id))
9969 return false;
9970
9971 AddSpellCooldown(triggered_spell_id, 0, cooldown);
9972 }
9973
9974 CastSpell(victim, triggered_spell_id, true, castItem, triggeredByAura);
9975
9976 return true;
9977}

References AddSpellCooldown(), CastSpell(), AuraEffect::GetAmount(), AuraEffect::GetBase(), Aura::GetCastItemGUID(), Player::GetItemByGuid(), AuraEffect::GetMiscValue(), getPowerType(), HasSpellCooldown(), IsAlive(), Object::IsPlayer(), LOG_ERROR, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, roll_chance_i(), SpellInfo::SpellVisual, sSpellMgr, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleProcExtraAttackFor()

void Unit::HandleProcExtraAttackFor ( Unit victim,
uint32  count 
)
2757{
2758 while (count)
2759 {
2760 --count;
2761 AttackerStateUpdate(victim, BASE_ATTACK, true);
2762 }
2763}
void AttackerStateUpdate(Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
Definition: Unit.cpp:2565

References AttackerStateUpdate(), and BASE_ATTACK.

Referenced by Update().

◆ HandleProcTriggerSpell()

bool Unit::HandleProcTriggerSpell ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
uint32  procPhase,
ProcEventInfo eventInfo 
)
private
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
8935{
8936 // Get triggered aura spell info
8937 SpellInfo const* auraSpellInfo = triggeredByAura->GetSpellInfo();
8938
8939 // Basepoints of trigger aura
8940 int32 triggerAmount = triggeredByAura->GetAmount();
8941
8942 // Set trigger spell id, target, custom basepoints
8943 uint32 trigger_spell_id = auraSpellInfo->Effects[triggeredByAura->GetEffIndex()].TriggerSpell;
8944
8945 Unit* target = nullptr;
8946 int32 basepoints0 = 0;
8947
8948 if (triggeredByAura->GetAuraType() == SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE)
8949 basepoints0 = triggerAmount;
8950
8951 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
8952 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
8953
8954 // Try handle unknown trigger spells
8955 //if (sSpellMgr->GetSpellInfo(trigger_spell_id) == nullptr)
8956 {
8957 switch (auraSpellInfo->SpellFamilyName)
8958 {
8960 switch (auraSpellInfo->Id)
8961 {
8962 case 43820: // Charm of the Witch Doctor (Amani Charm of the Witch Doctor trinket)
8963 // Pct value stored in dummy
8964 if (!victim)
8965 return false;
8966 basepoints0 = victim->GetCreateHealth() * auraSpellInfo->Effects[1].CalcValue() / 100;
8967 target = victim;
8968 break;
8969 case 57345: // Darkmoon Card: Greatness
8970 {
8971 float stat = 0.0f;
8972 // strength
8973 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 60229; stat = GetStat(STAT_STRENGTH); }
8974 // agility
8975 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 60233; stat = GetStat(STAT_AGILITY); }
8976 // intellect
8977 if (GetStat(STAT_INTELLECT) > stat) { trigger_spell_id = 60234; stat = GetStat(STAT_INTELLECT);}
8978 // spirit
8979 if (GetStat(STAT_SPIRIT) > stat) { trigger_spell_id = 60235; }
8980 break;
8981 }
8982 case 67702: // Death's Choice, Item - Coliseum 25 Normal Melee Trinket
8983 {
8984 if (!damage)
8985 return false;
8986 float stat = 0.0f;
8987 // strength
8988 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67708; stat = GetStat(STAT_STRENGTH); }
8989 // agility
8990 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67703; }
8991 break;
8992 }
8993 case 67771: // Death's Choice (heroic), Item - Coliseum 25 Heroic Melee Trinket
8994 {
8995 if (!damage)
8996 return false;
8997 float stat = 0.0f;
8998 // strength
8999 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67773; stat = GetStat(STAT_STRENGTH); }
9000 // agility
9001 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67772; }
9002 break;
9003 }
9004 case 27522: // Mana Drain Trigger
9005 case 40336: // Mana Drain Trigger
9006 case 46939: // Black Bow of the Betrayer
9007 {
9008 // On successful melee or ranged attack gain $29471s1 mana and if possible drain $27526s1 mana from the target.
9009 if (IsAlive())
9010 CastSpell(this, 29471, true, castItem, triggeredByAura);
9011 if (victim && victim->IsAlive())
9012 CastSpell(victim, 27526, true, castItem, triggeredByAura);
9013 return true;
9014 }
9015 // Forge of Souls, Devourer of Souls, Mirrored Soul
9016 case 69023:
9017 {
9018 int32 dmg = damage * 0.45f;
9019 if (dmg > 0)
9020 if (Aura* a = GetAura(69023))
9021 if (Unit* c = a->GetCaster())
9022 CastCustomSpell(c, 69034, &dmg, 0, 0, true);
9023 return true;
9024 }
9025 // Soul-Trader Beacon proc aura
9026 case 50051:
9027 {
9028 if (!victim)
9029 return false;
9030
9031 if (Creature* cr = GetCompanionPet())
9032 cr->CastSpell(victim, 50101, true);
9033
9034 return false;
9035 }
9036 }
9037 break;
9038 case SPELLFAMILY_MAGE:
9039 if (auraSpellInfo->SpellIconID == 2127) // Blazing Speed
9040 {
9041 switch (auraSpellInfo->Id)
9042 {
9043 case 31641: // Rank 1
9044 case 31642: // Rank 2
9045 trigger_spell_id = 31643;
9046 break;
9047 default:
9048 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} miss posibly Blazing Speed", auraSpellInfo->Id);
9049 return false;
9050 }
9051 }
9052 else if (auraSpellInfo->Id == 71761) // Deep Freeze Immunity State (only permanent)
9053 {
9054 Creature* creature = victim->ToCreature();
9055 if (!creature || !creature->HasMechanicTemplateImmunity(1 << (MECHANIC_STUN - 1)))
9056 return false;
9057 }
9058 break;
9060 {
9061 // Nether Protection
9062 if (auraSpellInfo->SpellIconID == 1985)
9063 {
9064 if (!procSpell)
9065 return false;
9066 switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
9067 {
9069 return false; // ignore
9070 case SPELL_SCHOOL_HOLY:
9071 trigger_spell_id = 54370;
9072 break;
9073 case SPELL_SCHOOL_FIRE:
9074 trigger_spell_id = 54371;
9075 break;
9077 trigger_spell_id = 54375;
9078 break;
9079 case SPELL_SCHOOL_FROST:
9080 trigger_spell_id = 54372;
9081 break;
9083 trigger_spell_id = 54374;
9084 break;
9086 trigger_spell_id = 54373;
9087 break;
9088 default:
9089 return false;
9090 }
9091 }
9092 break;
9093 }
9094 case SPELLFAMILY_PRIEST:
9095 {
9096 // Blessed Recovery
9097 if (auraSpellInfo->SpellIconID == 1875)
9098 {
9099 switch (auraSpellInfo->Id)
9100 {
9101 case 27811:
9102 trigger_spell_id = 27813;
9103 break;
9104 case 27815:
9105 trigger_spell_id = 27817;
9106 break;
9107 case 27816:
9108 trigger_spell_id = 27818;
9109 break;
9110 default:
9111 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} not handled in BR", auraSpellInfo->Id);
9112 return false;
9113 }
9114 basepoints0 = CalculatePct(int32(damage), triggerAmount) / 3;
9115 target = this;
9116 // Add remaining ticks to healing done
9117 CastDelayedSpellWithPeriodicAmount(this, trigger_spell_id, SPELL_AURA_PERIODIC_HEAL, basepoints0);
9118 return true;
9119 }
9120 break;
9121 }
9122 case SPELLFAMILY_DRUID:
9123 {
9124 switch (auraSpellInfo->Id)
9125 {
9126 // Druid Forms Trinket
9127 case 37336:
9128 {
9129 switch (GetShapeshiftForm())
9130 {
9131 case FORM_NONE:
9132 trigger_spell_id = 37344;
9133 break;
9134 case FORM_CAT:
9135 trigger_spell_id = 37341;
9136 break;
9137 case FORM_BEAR:
9138 case FORM_DIREBEAR:
9139 trigger_spell_id = 37340;
9140 break;
9141 case FORM_TREE:
9142 trigger_spell_id = 37342;
9143 break;
9144 case FORM_MOONKIN:
9145 trigger_spell_id = 37343;
9146 break;
9147 default:
9148 return false;
9149 }
9150 break;
9151 }
9152 // Druid T9 Feral Relic (Lacerate, Swipe, Mangle, and Shred)
9153 case 67353:
9154 {
9155 switch (GetShapeshiftForm())
9156 {
9157 case FORM_CAT:
9158 trigger_spell_id = 67355;
9159 break;
9160 case FORM_BEAR:
9161 case FORM_DIREBEAR:
9162 trigger_spell_id = 67354;
9163 break;
9164 default:
9165 return false;
9166 }
9167 break;
9168 }
9169 default:
9170 break;
9171 }
9172 break;
9173 }
9174 case SPELLFAMILY_HUNTER:
9175 {
9176 if (auraSpellInfo->SpellIconID == 3247) // Piercing Shots
9177 {
9178 if (!victim)
9179 return false;
9180
9181 switch (auraSpellInfo->Id)
9182 {
9183 case 53234: // Rank 1
9184 case 53237: // Rank 2
9185 case 53238: // Rank 3
9186 trigger_spell_id = 63468;
9187 break;
9188 default:
9189 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} miss posibly Piercing Shots", auraSpellInfo->Id);
9190 return false;
9191 }
9192 SpellInfo const* TriggerPS = sSpellMgr->GetSpellInfo(trigger_spell_id);
9193 if (!TriggerPS)
9194 return false;
9195
9196 basepoints0 = CalculatePct(int32(damage), triggerAmount) / (TriggerPS->GetMaxDuration() / TriggerPS->Effects[0].Amplitude);
9197 victim->CastDelayedSpellWithPeriodicAmount(this, trigger_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
9198 return true;
9199 }
9200 // Item - Hunter T9 4P Bonus (Steady Shot)
9201 else if (auraSpellInfo->Id == 67151)
9202 {
9203 if (!IsPlayer() || !ToPlayer()->GetPet())
9204 return false;
9205
9206 target = ToPlayer()->GetPet();
9207 trigger_spell_id = 68130;
9208 break;
9209 }
9210 break;
9211 }
9213 {
9214 switch (auraSpellInfo->Id)
9215 {
9216 // Soul Preserver
9217 case 60510:
9218 {
9219 switch (getClass())
9220 {
9221 case CLASS_DRUID:
9222 trigger_spell_id = 60512;
9223 break;
9224 case CLASS_PALADIN:
9225 trigger_spell_id = 60513;
9226 break;
9227 case CLASS_PRIEST:
9228 trigger_spell_id = 60514;
9229 break;
9230 case CLASS_SHAMAN:
9231 trigger_spell_id = 60515;
9232 break;
9233 }
9234
9235 target = this;
9236 break;
9237 }
9238 case 37657: // Lightning Capacitor
9239 case 54841: // Thunder Capacitor
9240 case 67712: // Item - Coliseum 25 Normal Caster Trinket
9241 case 67758: // Item - Coliseum 25 Heroic Caster Trinket
9242 {
9243 if (!victim || !victim->IsAlive() || !IsPlayer())
9244 return false;
9245
9246 uint32 stack_spell_id = 0;
9247 switch (auraSpellInfo->Id)
9248 {
9249 case 37657:
9250 stack_spell_id = 37658;
9251 trigger_spell_id = 37661;
9252 break;
9253 case 54841:
9254 stack_spell_id = 54842;
9255 trigger_spell_id = 54843;
9256 break;
9257 case 67712:
9258 stack_spell_id = 67713;
9259 trigger_spell_id = 67714;
9260 break;
9261 case 67758:
9262 stack_spell_id = 67759;
9263 trigger_spell_id = 67760;
9264 break;
9265 }
9266
9267 if (cooldown && ToPlayer()->HasSpellCooldown(stack_spell_id))
9268 {
9269 return false;
9270 }
9271
9272 CastSpell(this, stack_spell_id, true, nullptr, triggeredByAura);
9273
9274 Aura* dummy = GetAura(stack_spell_id);
9275 if (!dummy || dummy->GetStackAmount() < triggerAmount)
9276 {
9277 return false;
9278 }
9279
9280 if (cooldown)
9281 {
9282 ToPlayer()->AddSpellCooldown(stack_spell_id, 0, cooldown);
9283 }
9284 RemoveAurasDueToSpell(stack_spell_id);
9285 CastSpell(victim, trigger_spell_id, true, nullptr, triggeredByAura);
9286 return true;
9287 }
9288 default:
9289 // Illumination
9290 if (auraSpellInfo->SpellIconID == 241)
9291 {
9292 if (!procSpell)
9293 return false;
9294 // procspell is triggered spell but we need mana cost of original casted spell
9295 uint32 originalSpellId = procSpell->Id;
9296 // Holy Shock heal
9297 if (procSpell->SpellFamilyFlags[1] & 0x00010000)
9298 {
9299 switch (procSpell->Id)
9300 {
9301 case 25914:
9302 originalSpellId = 20473;
9303 break;
9304 case 25913:
9305 originalSpellId = 20929;
9306 break;
9307 case 25903:
9308 originalSpellId = 20930;
9309 break;
9310 case 27175:
9311 originalSpellId = 27174;
9312 break;
9313 case 33074:
9314 originalSpellId = 33072;
9315 break;
9316 case 48820:
9317 originalSpellId = 48824;
9318 break;
9319 case 48821:
9320 originalSpellId = 48825;
9321 break;
9322 default:
9323 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} not handled in HShock", procSpell->Id);
9324 return false;
9325 }
9326 }
9327 SpellInfo const* originalSpell = sSpellMgr->GetSpellInfo(originalSpellId);
9328 if (!originalSpell)
9329 {
9330 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} unknown but selected as original in Illu", originalSpellId);
9331 return false;
9332 }
9333 // percent stored in effect 1 (class scripts) base points
9334 int32 cost = int32(originalSpell->ManaCost + CalculatePct(GetCreateMana(), originalSpell->ManaCostPercentage));
9335 basepoints0 = CalculatePct(cost, auraSpellInfo->Effects[1].CalcValue());
9336 trigger_spell_id = 20272;
9337 target = this;
9338 }
9339 break;
9340 }
9341 break;
9342 }
9343 case SPELLFAMILY_SHAMAN:
9344 {
9345 // Lightning Shield (overwrite non existing triggered spell call in spell.dbc
9346 if (auraSpellInfo->SpellFamilyFlags[0] & 0x400 && auraSpellInfo->HasAttribute(SPELL_ATTR1_NO_THREAT))
9347 {
9348 // Do not proc off from self-casted items
9349 if (Spell const* spell = eventInfo.GetProcSpell())
9350 {
9351 if (spell->m_castItemGUID && victim->GetGUID() == GetGUID())
9352 {
9353 return false;
9354 }
9355 }
9356
9357 trigger_spell_id = sSpellMgr->GetSpellWithRank(26364, auraSpellInfo->GetRank());
9358 }
9359 // Nature's Guardian
9360 else if (auraSpellInfo->SpellIconID == 2013)
9361 {
9362 // Check health condition - should drop to less 30% (damage deal after this!)
9363 if (!HealthBelowPctDamaged(30, damage))
9364 return false;
9365
9366 if (victim && victim->IsAlive())
9367 victim->GetThreatMgr().ModifyThreatByPercent(this, -10);
9368
9369 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
9370 trigger_spell_id = 31616;
9371 target = this;
9372 }
9373 break;
9374 }
9376 {
9377 // Acclimation
9378 if (auraSpellInfo->SpellIconID == 1930)
9379 {
9380 if (!procSpell)
9381 return false;
9382 switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
9383 {
9385 return false; // ignore
9386 case SPELL_SCHOOL_HOLY:
9387 trigger_spell_id = 50490;
9388 break;
9389 case SPELL_SCHOOL_FIRE:
9390 trigger_spell_id = 50362;
9391 break;
9393 trigger_spell_id = 50488;
9394 break;
9395 case SPELL_SCHOOL_FROST:
9396 trigger_spell_id = 50485;
9397 break;
9399 trigger_spell_id = 50489;
9400 break;
9402 trigger_spell_id = 50486;
9403 break;
9404 default:
9405 return false;
9406 }
9407 }
9408 // Blood Presence (Improved)
9409 else if (auraSpellInfo->Id == 63611)
9410 {
9411 if (!IsPlayer())
9412 return false;
9413
9414 trigger_spell_id = 50475;
9415 basepoints0 = CalculatePct(int32(damage), triggerAmount);
9416 }
9417 break;
9418 }
9419 }
9420 }
9421
9422 // All ok. Check current trigger spell
9423 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(trigger_spell_id);
9424 if (!triggerEntry)
9425 {
9426 // Don't cast unknown spell
9427 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} (effIndex: {}) has unknown TriggerSpell {}. Unhandled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex(), trigger_spell_id);
9428 return false;
9429 }
9430
9431 // not allow proc extra attack spell at extra attack
9432 if (triggerEntry->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS))
9433 {
9434 uint32 lastExtraAttackSpell = eventInfo.GetActor()->GetLastExtraAttackSpell();
9435
9436 // Patch 1.12.0(?) extra attack abilities can no longer chain proc themselves
9437 if (lastExtraAttackSpell == trigger_spell_id)
9438 {
9439 return false;
9440 }
9441
9442 // Patch 2.2.0 Sword Specialization (Warrior, Rogue) extra attack can no longer proc additional extra attacks
9443 // 3.3.5 Sword Specialization (Warrior), Hack and Slash (Rogue)
9444 if (lastExtraAttackSpell == SPELL_SWORD_SPECIALIZATION || lastExtraAttackSpell == SPELL_HACK_AND_SLASH)
9445 {
9446 return false;
9447 }
9448 }
9449
9450 // Custom requirements (not listed in procEx) Warning! damage dealing after this
9451 // Custom triggered spells
9452 switch (auraSpellInfo->Id)
9453 {
9454 // Deep Wounds
9455 case 12834:
9456 case 12849:
9457 case 12867:
9458 {
9459 if (!IsPlayer())
9460 return false;
9461
9462 if (procFlags & PROC_FLAG_DONE_OFFHAND_ATTACK)
9464 else
9466 break;
9467 }
9468 // Persistent Shield (Scarab Brooch trinket)
9469 // This spell originally trigger 13567 - Dummy Trigger (vs dummy efect)
9470 case 26467:
9471 {
9472 basepoints0 = int32(CalculatePct(damage, 15));
9473 target = victim;
9474 trigger_spell_id = 26470;
9475 break;
9476 }
9477 // Unyielding Knights (item exploit 29108\29109)
9478 case 38164:
9479 {
9480 if (!victim || victim->GetEntry() != 19457) // Proc only if your target is Grillok
9481 return false;
9482 break;
9483 }
9484 // Deflection
9485 case 52420:
9486 {
9487 if (!HealthBelowPct(35))
9488 return false;
9489 break;
9490 }
9491
9492 // Cheat Death
9493 case 28845:
9494 {
9495 // When your health drops below 20%
9496 if (HealthBelowPctDamaged(20, damage) || HealthBelowPct(20))
9497 return false;
9498 break;
9499 }
9500 // Deadly Swiftness (Rank 1)
9501 case 31255:
9502 {
9503 // whenever you deal damage to a target who is below 20% health.
9504 if (!victim || !victim->IsAlive() || victim->HealthAbovePct(20))
9505 return false;
9506
9507 target = this;
9508 trigger_spell_id = 22588;
9509 [[fallthrough]];
9510 }
9511 // Bonus Healing (Crystal Spire of Karabor mace)
9512 case 40971:
9513 {
9514 // If your target is below $s1% health
9515 if (!victim || !victim->IsAlive() || victim->HealthAbovePct(triggerAmount))
9516 return false;
9517 break;
9518 }
9519 // Rapid Recuperation
9520 case 53228:
9521 case 53232:
9522 {
9523 // This effect only from Rapid Fire (ability cast)
9524 if (!procSpell || !(procSpell->SpellFamilyFlags[0] & 0x20))
9525 return false;
9526 break;
9527 }
9528 // Decimation
9529 case 63156:
9530 case 63158:
9531 // Can proc only if target has hp below 35%
9532 if (!victim || !victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, procSpell, this))
9533 return false;
9534 break;
9535 // Ulduar, Hodir, Toasty Fire
9536 case 62821:
9537 if (!this->IsPlayer()) // spell has Attribute, but persistent area auras ignore it
9538 return false;
9539 break;
9540 case 15337: // Improved Spirit Tap (Rank 1)
9541 case 15338: // Improved Spirit Tap (Rank 2)
9542 {
9543 if (!procSpell)
9544 return false;
9545
9546 if (procSpell->SpellFamilyFlags[0] & 0x800000)
9547 if ((procSpell->Id != 58381) || !roll_chance_i(50))
9548 return false;
9549
9550 target = victim;
9551 break;
9552 }
9553 // Professor Putricide - Ooze Spell Tank Protection
9554 case 71770:
9555 if (victim)
9556 victim->CastSpell(victim, trigger_spell_id, true); // EffectImplicitTarget is self
9557 return true;
9558 case 45057: // Evasive Maneuvers (Commendation of Kael`thas trinket)
9559 case 71634: // Item - Icecrown 25 Normal Tank Trinket 1
9560 case 71640: // Item - Icecrown 25 Heroic Tank Trinket 1
9561 case 75475: // Item - Chamber of Aspects 25 Normal Tank Trinket
9562 case 75481: // Item - Chamber of Aspects 25 Heroic Tank Trinket
9563 {
9564 // Procs only if damage takes health below $s1%
9565 if (!HealthBelowPctDamaged(triggerAmount, damage))
9566 return false;
9567 break;
9568 }
9569 default:
9570 break;
9571 }
9572
9573 if (auraSpellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
9574 {
9575 // Xinef: keep this order, Aura 70656 has SpellIconID 85!
9576 // Item - Death Knight T10 Melee 4P Bonus
9577 if (auraSpellInfo->Id == 70656)
9578 {
9580 return false;
9581
9582 for (uint8 i = 0; i < MAX_RUNES; ++i)
9583 if (ToPlayer()->GetRuneCooldown(i) == 0)
9584 return false;
9585 }
9586 // Blade Barrier
9587 else if (auraSpellInfo->SpellIconID == 85)
9588 {
9589 Player* plr = ToPlayer();
9590 if (!plr || !plr->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY) || !procSpell)
9591 return false;
9592
9594 return false;
9595 }
9596 // Rime
9597 else if (auraSpellInfo->SpellIconID == 56)
9598 {
9599 if (!IsPlayer())
9600 return false;
9601
9602 // Howling Blast
9604 }
9605 }
9606
9607 // Custom basepoints/target for exist spell
9608 // dummy basepoints or other customs
9609 switch (trigger_spell_id)
9610 {
9611 // Auras which should proc on area aura source (caster in this case):
9612 // Turn the Tables
9613 case 52914:
9614 case 52915:
9615 case 52910:
9616 // Honor Among Thieves
9617 case 51699:
9618 {
9619 target = triggeredByAura->GetBase()->GetCaster();
9620 if (!target)
9621 return false;
9622
9623 if (Player* pTarget = target->ToPlayer())
9624 {
9625 if (cooldown)
9626 {
9627 if (pTarget->HasSpellCooldown(trigger_spell_id))
9628 return false;
9629 pTarget->AddSpellCooldown(trigger_spell_id, 0, cooldown);
9630 }
9631
9632 Unit* cptarget = nullptr;
9633 if (trigger_spell_id == 51699)
9634 {
9635 cptarget = pTarget->GetComboTarget();
9636 if (!cptarget)
9637 {
9638 cptarget = pTarget->GetSelectedUnit();
9639 }
9640 }
9641 else
9642 cptarget = target;
9643
9644 if (cptarget)
9645 {
9646 target->CastSpell(cptarget, trigger_spell_id, true);
9647 return true;
9648 }
9649 }
9650 return false;
9651 }
9652 // Cast positive spell on enemy target
9653 case 7099: // Curse of Mending
9654 case 39703: // Curse of Mending
9655 case 20233: // Improved Lay on Hands (cast on target)
9656 {
9657 target = victim;
9658 break;
9659 }
9660 // Ruby Drake, Evasive Aura
9661 case 50241:
9662 {
9663 if (GetAura(50240))
9664 return false;
9665
9666 break;
9667 }
9668 // Combo points add triggers (need add combopoint only for main target, and after possible combopoints reset)
9669 case 15250: // Rogue Setup
9670 {
9671 // applied only for main target
9672 if (!victim || (IsPlayer() && victim != ToPlayer()->GetSelectedUnit()))
9673 return false;
9674 break; // continue normal case
9675 }
9676 // Finish movies that add combo
9677 case 14189: // Seal Fate (Netherblade set)
9678 case 14157: // Ruthlessness
9679 {
9680 victim = nullptr;
9681 // Need add combopoint AFTER finish movie (or they dropped in finish phase)
9682 break;
9683 }
9684 // Item - Druid T10 Balance 2P Bonus
9685 case 16870:
9686 {
9687 if (HasAura(70718))
9688 CastSpell(this, 70721, true);
9689 RemoveAurasDueToSpell(trigger_spell_id);
9690 break;
9691 }
9692 // Shamanistic Rage triggered spell
9693 case 30824:
9694 {
9695 basepoints0 = int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), triggerAmount));
9696 break;
9697 }
9698 // Enlightenment (trigger only from mana cost spells)
9699 case 35095:
9700 {
9701 if (!procSpell || procSpell->PowerType != POWER_MANA || (procSpell->ManaCost == 0 && procSpell->ManaCostPercentage == 0 && procSpell->ManaCostPerlevel == 0))
9702 return false;
9703 break;
9704 }
9705 case 46916: // Slam! (Bloodsurge proc)
9706 case 52437: // Sudden Death
9707 {
9708 // Item - Warrior T10 Melee 4P Bonus
9709 if (AuraEffect const* aurEff = GetAuraEffect(70847, 0))
9710 {
9711 if (!roll_chance_i(aurEff->GetAmount()))
9712 {
9713 // Xinef: dont allow normal proc to override set one
9714 if (GetAura((trigger_spell_id == 46916) ? 71072 : 71069))
9715 return false;
9716 // Xinef: just to be sure
9717 RemoveAurasDueToSpell(70849);
9718 break;
9719 }
9720
9721 // Xinef: fully remove all auras and reapply once more
9722 RemoveAurasDueToSpell(70849);
9723 RemoveAurasDueToSpell(71072);
9724 RemoveAurasDueToSpell(71069);
9725
9726 CastSpell(this, 70849, true, castItem, triggeredByAura); // Extra Charge!
9727 if (trigger_spell_id == 46916)
9728 CastSpell(this, 71072, true, castItem, triggeredByAura); // Slam GCD Reduced
9729 else
9730 CastSpell(this, 71069, true, castItem, triggeredByAura); // Execute GCD Reduced
9731 }
9732 break;
9733 }
9734 // Sword and Board
9735 case 50227:
9736 {
9737 // Remove cooldown on Shield Slam
9738 if (IsPlayer())
9740 break;
9741 }
9742 // Maelstrom Weapon
9743 case 53817:
9744 {
9745 // have rank dependent proc chance, ignore too often cases
9746 // PPM = 2.5 * (rank of talent),
9747 uint32 rank = auraSpellInfo->GetRank();
9748 // 5 rank -> 100% 4 rank -> 80% and etc from full rate
9749 if (!roll_chance_i(20 * rank))
9750 return false;
9751
9752 // Item - Shaman T10 Enhancement 4P Bonus
9753 if (AuraEffect const* aurEff = GetAuraEffect(70832, 0))
9754 if (Aura const* maelstrom = GetAura(53817))
9755 // xinef: we have 4 charges and all proc conditions are met - aura reaches 5 charges
9756 if ((maelstrom->GetStackAmount() == 4) && roll_chance_i(aurEff->GetAmount()))
9757 CastSpell(this, 70831, true, castItem, triggeredByAura);
9758
9759 break;
9760 }
9761 // Astral Shift
9762 case 52179:
9763 {
9764 if (!procSpell || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
9765 return false;
9766
9767 // Need stun, fear or silence mechanic
9768 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_SILENCE) | (1 << MECHANIC_STUN) | (1 << MECHANIC_FEAR))))
9769 return false;
9770 break;
9771 }
9772 // Glyph of Death's Embrace
9773 case 58679:
9774 {
9775 // Proc only from healing part of Death Coil. Check is essential as all Death Coil spells have 0x2000 mask in SpellFamilyFlags
9776 if (!procSpell || !(procSpell->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && procSpell->SpellFamilyFlags[0] == 0x80002000))
9777 return false;
9778 break;
9779 }
9780 // Glyph of Death Grip
9781 case 58628:
9782 {
9783 // remove cooldown of Death Grip
9784 if (IsPlayer())
9785 ToPlayer()->RemoveSpellCooldown(49576, true);
9786 return true;
9787 }
9788 // Savage Defense
9789 case 62606:
9790 {
9791 basepoints0 = CalculatePct(triggerAmount, GetTotalAttackPowerValue(BASE_ATTACK));
9792 break;
9793 }
9794 // Body and Soul
9795 case 64128:
9796 case 65081:
9797 {
9798 // Proc only from PW:S cast
9799 if (!procSpell || !(procSpell->SpellFamilyFlags[0] & 0x00000001))
9800 return false;
9801 break;
9802 }
9803 // Culling the Herd
9804 case 70893:
9805 {
9806 if (!procSpell)
9807 {
9808 return false;
9809 }
9810 // check if we're doing a critical hit
9811 if (!(procSpell->SpellFamilyFlags[1] & 0x10000000) && (procEx != PROC_EX_CRITICAL_HIT))
9812 return false;
9813 // check if we're procced by Claw, Bite or Smack (need to use the spell icon ID to detect it)
9814 if (!(procSpell->SpellIconID == 262 || procSpell->SpellIconID == 1680 || procSpell->SpellIconID == 473))
9815 return false;
9816 break;
9817 }
9818 // Fingers of Frost, synchronise with Frostbite
9819 case 44544:
9820 {
9821 if (procPhase == PROC_SPELL_PHASE_HIT)
9822 {
9823 // Find Frostbite
9825 {
9826 if (!victim)
9827 return false;
9828
9829 uint8 fofRank = sSpellMgr->GetSpellRank(triggeredByAura->GetId());
9830 uint8 fbRank = sSpellMgr->GetSpellRank(aurEff->GetId());
9831 uint8 chance = uint8(std::ceil(fofRank * fbRank * 16.6f));
9832
9833 if (roll_chance_i(chance))
9834 CastSpell(victim, aurEff->GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, true);
9835 }
9836 }
9837 break;
9838 }
9839 }
9840
9841 // try detect target manually if not set
9842 if (!target)
9843 target = !(procFlags & (PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS)) && triggerEntry->IsPositive() ? this : victim;
9844
9845 if (cooldown)
9846 {
9847 if (HasSpellCooldown(triggerEntry->Id))
9848 return false;
9849
9850 AddSpellCooldown(triggerEntry->Id, 0, cooldown);
9851 }
9852
9853 if (basepoints0)
9854 CastCustomSpell(target, triggerEntry->Id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
9855 else
9856 CastSpell(target, triggerEntry->Id, true, castItem, triggeredByAura);
9857
9858 return true;
9859}
@ SPELL_EFFECT_ADD_EXTRA_ATTACKS
Definition: SharedDefines.h:797
@ SPELL_ATTR1_NO_THREAT
Definition: SharedDefines.h:429
@ MECHANIC_FEAR
Definition: SharedDefines.h:1330
@ MECHANIC_SILENCE
Definition: SharedDefines.h:1334
@ AURA_STATE_HEALTHLESS_35_PERCENT
Definition: SharedDefines.h:1305
@ SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE
Definition: SpellAuraDefines.h:294
@ SPELL_AURA_ADD_TARGET_TRIGGER
Definition: SpellAuraDefines.h:172
@ PROC_SPELL_PHASE_HIT
Definition: SpellMgr.h:244
@ SPELL_HACK_AND_SLASH
Definition: Unit.h:292
@ SPELL_SWORD_SPECIALIZATION
Definition: Unit.h:291
@ FORM_MOONKIN
Definition: UnitDefines.h:98
@ FORM_NONE
Definition: UnitDefines.h:69
@ FORM_TREE
Definition: UnitDefines.h:71
void ModifyThreatByPercent(Unit *victim, int32 percent)
Definition: ThreatMgr.cpp:508
bool HasMechanicTemplateImmunity(uint32 mask) const
Definition: Creature.cpp:2214
bool IsBaseRuneSlotsOnCooldown(RuneType runeType) const
Definition: Player.cpp:13490
void RemoveCategoryCooldown(uint32 cat)
Definition: Player.cpp:3522
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition: Player.cpp:1281
Spell const * GetProcSpell() const
Definition: Unit.h:448
Unit * GetActor()
Definition: Unit.h:439
bool HealthAbovePct(int32 pct) const
Definition: Unit.h:1039
Creature * GetCompanionPet() const
Definition: Unit.cpp:10666
float GetTotalAttackPowerValue(WeaponAttackType attType, Unit *pVictim=nullptr) const
Definition: Unit.cpp:15428
uint32 GetLastExtraAttackSpell() const
Definition: Unit.h:954
uint32 GetCreateHealth() const
Definition: Unit.h:1033
Unit * GetComboTarget() const
Definition: Unit.h:960
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition: Unit.h:1038
uint8 GetRank() const
Definition: SpellInfo.cpp:2494
uint32 ManaCostPercentage
Definition: SpellInfo.h:367
bool HasEffect(SpellEffects effect) const
Definition: SpellInfo.cpp:876
uint32 ManaCost
Definition: SpellInfo.h:363

References Player::AddSpellCooldown(), AddSpellCooldown(), AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, CalculatePct(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_PALADIN, CLASS_PRIEST, CLASS_SHAMAN, CountPctFromMaxHealth(), EFFECT_0, SpellInfo::Effects, FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_MOONKIN, FORM_NONE, FORM_TREE, ProcEventInfo::GetActor(), SpellInfo::GetAllEffectsMechanicMask(), AuraEffect::GetAmount(), GetAura(), GetAuraEffect(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), Aura::GetCaster(), Aura::GetCastItemGUID(), getClass(), GetComboTarget(), GetCompanionPet(), GetCreateHealth(), GetCreateMana(), AuraEffect::GetEffIndex(), Object::GetEntry(), GetFirstSchoolInMask(), Object::GetFloatValue(), Object::GetGUID(), AuraEffect::GetId(), Player::GetItemByGuid(), GetLastExtraAttackSpell(), SpellInfo::GetMaxDuration(), Player::GetPet(), ProcEventInfo::GetProcSpell(), SpellInfo::GetRank(), SpellInfo::GetSchoolMask(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), Aura::GetStackAmount(), GetStat(), GetThreatMgr(), GetTotalAttackPowerValue(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), SpellInfo::HasEffect(), Creature::HasMechanicTemplateImmunity(), HasSpellCooldown(), HealthAbovePct(), HealthBelowPct(), HealthBelowPctDamaged(), SpellInfo::Id, IsAlive(), Player::IsBaseRuneSlotsOnCooldown(), Player::IsClass(), IsClass(), Object::IsPlayer(), SpellInfo::IsPositive(), LOG_ERROR, SpellInfo::ManaCost, SpellInfo::ManaCostPercentage, SpellInfo::ManaCostPerlevel, MAX_RUNES, MECHANIC_FEAR, MECHANIC_SILENCE, MECHANIC_STUN, ThreatMgr::ModifyThreatByPercent(), POWER_MANA, SpellInfo::PowerType, PROC_EX_CRITICAL_HIT, PROC_EX_NORMAL_HIT, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS, PROC_SPELL_PHASE_HIT, RemoveAurasDueToSpell(), Player::RemoveCategoryCooldown(), Player::RemoveSpellCooldown(), roll_chance_i(), RUNE_BLOOD, SPELL_ATTR1_NO_THREAT, SPELL_AURA_ADD_TARGET_TRIGGER, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE, SPELL_EFFECT_ADD_EXTRA_ATTACKS, SPELL_HACK_AND_SLASH, SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_NORMAL, SPELL_SCHOOL_SHADOW, SPELL_SWORD_SPECIALIZATION, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PRIEST, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, sSpellMgr, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STRENGTH, Object::ToCreature(), Object::ToPlayer(), UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MINDAMAGE, and UNIT_FIELD_MINOFFHANDDAMAGE.

Referenced by ProcDamageAndSpellFor().

◆ HandleSafeUnitPointersOnDelete()

void Unit::HandleSafeUnitPointersOnDelete ( Unit thisUnit)
static
4330{
4331 if (thisUnit->SafeUnitPointerSet.empty())
4332 return;
4333 for (std::set<SafeUnitPointer*>::iterator itr = thisUnit->SafeUnitPointerSet.begin(); itr != thisUnit->SafeUnitPointerSet.end(); ++itr)
4334 (*itr)->UnitDeleted();
4335
4336 thisUnit->SafeUnitPointerSet.clear();
4337}

References SafeUnitPointerSet.

Referenced by ~Unit().

◆ HandleSpellClick()

bool Unit::HandleSpellClick ( Unit clicker,
int8  seatId = -1 
)

First check simple relations from clicker to clickee

Check database conditions

19556{
19557 Creature* creature = ToCreature();
19558 if (creature && creature->IsAIEnabled)
19559 {
19560 if (!creature->AI()->BeforeSpellClick(clicker))
19561 {
19562 return false;
19563 }
19564 }
19565
19566 bool result = false;
19567 uint32 spellClickEntry = GetVehicleKit() ? GetVehicleKit()->GetCreatureEntry() : GetEntry();
19568 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(spellClickEntry);
19569 for (SpellClickInfoContainer::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr)
19570 {
19572 if (!itr->second.IsFitToRequirements(clicker, this))
19573 continue;
19574
19576 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(spellClickEntry, itr->second.spellId);
19577 ConditionSourceInfo info = ConditionSourceInfo(clicker, this);
19578 if (!sConditionMgr->IsObjectMeetToConditions(info, conds))
19579 continue;
19580
19581 Unit* caster = (itr->second.castFlags & NPC_CLICK_CAST_CASTER_CLICKER) ? clicker : this;
19582 Unit* target = (itr->second.castFlags & NPC_CLICK_CAST_TARGET_CLICKER) ? clicker : this;
19583 ObjectGuid origCasterGUID = (itr->second.castFlags & NPC_CLICK_CAST_ORIG_CASTER_OWNER) ? GetOwnerGUID() : clicker->GetGUID();
19584
19585 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->second.spellId);
19586
19587 // xinef: dont allow players to enter vehicles on arena
19588 if (spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) && caster->IsPlayer() && caster->FindMap() && caster->FindMap()->IsBattleArena())
19589 continue;
19590
19591 if (seatId > -1)
19592 {
19593 uint8 i = 0;
19594 bool valid = false;
19595 while (i < MAX_SPELL_EFFECTS)
19596 {
19597 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_CONTROL_VEHICLE)
19598 {
19599 valid = true;
19600 break;
19601 }
19602 ++i;
19603 }
19604
19605 if (!valid)
19606 {
19607 LOG_ERROR("sql.sql", "Spell {} specified in npc_spellclick_spells is not a valid vehicle enter aura!", itr->second.spellId);
19608 continue;
19609 }
19610
19611 if (IsInMap(caster))
19612 caster->CastCustomSpell(itr->second.spellId, SpellValueMod(SPELLVALUE_BASE_POINT0 + i), seatId + 1, target, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19613 else // This can happen during Player::_LoadAuras
19614 {
19616 for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j)
19617 bp0[j] = spellInfo->Effects[j].BasePoints;
19618
19619 bp0[i] = seatId;
19620 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, bp0, nullptr, origCasterGUID);
19621 }
19622 }
19623 else
19624 {
19625 if (IsInMap(caster))
19626 caster->CastSpell(target, spellInfo, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19627 else
19628 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, nullptr, nullptr, origCasterGUID);
19629 }
19630
19631 result = true;
19632 }
19633
19634 if (creature && creature->IsAIEnabled)
19635 creature->AI()->OnSpellClick(clicker, result);
19636
19637 return result;
19638}
@ NPC_CLICK_CAST_TARGET_CLICKER
Definition: SharedDefines.h:691
@ NPC_CLICK_CAST_ORIG_CASTER_OWNER
Definition: SharedDefines.h:692
@ NPC_CLICK_CAST_CASTER_CLICKER
Definition: SharedDefines.h:690
std::pair< SpellClickInfoContainer::const_iterator, SpellClickInfoContainer::const_iterator > SpellClickInfoMapBounds
Definition: ObjectMgr.h:408
SpellValueMod
Definition: SpellDefines.h:112
#define sConditionMgr
Definition: ConditionMgr.h:290
std::list< Condition * > ConditionList
Definition: ConditionMgr.h:237
virtual void OnSpellClick(Unit *, bool &)
Definition: CreatureAI.h:203
virtual bool BeforeSpellClick(Unit *)
Definition: CreatureAI.h:201
Definition: ConditionMgr.h:182
Map * FindMap() const
Definition: Object.h:532
uint32 GetCreatureEntry() const
Definition: Vehicle.h:39
bool IsBattleArena() const
Definition: Map.h:453
bool HasAura(AuraType aura) const
Definition: SpellInfo.cpp:893

References Creature::AI(), CreatureAI::BeforeSpellClick(), CastCustomSpell(), CastSpell(), SpellInfo::Effects, WorldObject::FindMap(), Vehicle::GetCreatureEntry(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), GetVehicleKit(), SpellInfo::HasAura(), IsAIEnabled, Map::IsBattleArena(), WorldObject::IsInMap(), Object::IsPlayer(), LOG_ERROR, MAX_EFFECT_MASK, MAX_SPELL_EFFECTS, NPC_CLICK_CAST_CASTER_CLICKER, NPC_CLICK_CAST_ORIG_CASTER_OWNER, NPC_CLICK_CAST_TARGET_CLICKER, CreatureAI::OnSpellClick(), sConditionMgr, sObjectMgr, SPELL_AURA_CONTROL_VEHICLE, SPELLVALUE_BASE_POINT0, sSpellMgr, Object::ToCreature(), TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE, TRIGGERED_NONE, and Aura::TryRefreshStackOrCreate().

Referenced by boss_xt002::boss_xt002AI::AttachHeart(), boss_kologarn::boss_kologarnAI::AttachLeftArm(), boss_kologarn::boss_kologarnAI::AttachRightArm(), WorldSession::HandleSpellClick(), Vehicle::InstallAccessory(), and npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI().

◆ HandleStatModifier()

bool Unit::HandleStatModifier ( UnitMods  unitMod,
UnitModifierType  modifierType,
float  amount,
bool  apply 
)
15204{
15205 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
15206 {
15207 LOG_ERROR("entities.unit", "ERROR in HandleStatModifier(): non-existing UnitMods or wrong UnitModifierType!");
15208 return false;
15209 }
15210
15211 switch (modifierType)
15212 {
15213 case BASE_VALUE:
15214 case TOTAL_VALUE:
15215 m_auraModifiersGroup[unitMod][modifierType] += apply ? amount : -amount;
15216 break;
15217 case BASE_PCT:
15218 case TOTAL_PCT:
15219 ApplyPercentModFloatVar(m_auraModifiersGroup[unitMod][modifierType], amount, apply);
15220 break;
15221 default:
15222 break;
15223 }
15224
15225 if (!CanModifyStats())
15226 return false;
15227
15228 switch (unitMod)
15229 {
15236 break;
15237
15238 case UNIT_MOD_ARMOR:
15239 UpdateArmor();
15240 break;
15241 case UNIT_MOD_HEALTH:
15243 break;
15244
15245 case UNIT_MOD_MANA:
15246 case UNIT_MOD_RAGE:
15247 case UNIT_MOD_FOCUS:
15248 case UNIT_MOD_ENERGY:
15249 case UNIT_MOD_HAPPINESS:
15250 case UNIT_MOD_RUNE:
15253 break;
15254
15262 break;
15263
15266 break;
15269 break;
15270
15273 break;
15276 break;
15279 break;
15280
15281 default:
15282 break;
15283 }
15284
15285 return true;
15286}
@ UNIT_MOD_ARMOR
Definition: Unit.h:156
@ UNIT_MOD_ATTACK_POWER
Definition: Unit.h:163
@ UNIT_MOD_HEALTH
Definition: Unit.h:148
@ UNIT_MOD_DAMAGE_RANGED
Definition: Unit.h:167
@ UNIT_MOD_DAMAGE_MAINHAND
Definition: Unit.h:165
@ UNIT_MOD_ATTACK_POWER_RANGED
Definition: Unit.h:164
void apply(T *val)
Definition: ByteConverter.h:40
SpellSchools GetSpellSchoolByAuraGroup(UnitMods unitMod) const
Definition: Unit.cpp:15345
Stats GetStatByAuraGroup(UnitMods unitMod) const
Definition: Unit.cpp:15377
virtual void UpdateAttackPowerAndDamage(bool ranged=false)=0
virtual void UpdateResistances(uint32 school)=0
Powers GetPowerTypeByAuraGroup(UnitMods unitMod) const
Definition: Unit.cpp:15406
virtual void UpdateDamagePhysical(WeaponAttackType attType)
Definition: StatSystem.cpp:60
virtual void UpdateArmor()=0
virtual void UpdateMaxPower(Powers power)=0
virtual bool UpdateStats(Stats stat)=0
bool CanModifyStats() const
Definition: Unit.h:1018
virtual void UpdateMaxHealth()=0

References ApplyPercentModFloatVar(), BASE_ATTACK, BASE_PCT, BASE_VALUE, CanModifyStats(), GetPowerTypeByAuraGroup(), GetSpellSchoolByAuraGroup(), GetStatByAuraGroup(), LOG_ERROR, m_auraModifiersGroup, MODIFIER_TYPE_END, OFF_ATTACK, RANGED_ATTACK, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_ARMOR, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, UNIT_MOD_END, UNIT_MOD_ENERGY, UNIT_MOD_FOCUS, UNIT_MOD_HAPPINESS, UNIT_MOD_HEALTH, UNIT_MOD_MANA, UNIT_MOD_RAGE, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, UNIT_MOD_RESISTANCE_SHADOW, UNIT_MOD_RUNE, UNIT_MOD_RUNIC_POWER, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, UNIT_MOD_STAT_STRENGTH, UpdateArmor(), UpdateAttackPowerAndDamage(), UpdateDamagePhysical(), UpdateMaxHealth(), UpdateMaxPower(), UpdateResistances(), and UpdateStats().

Referenced by Player::_ApplyItemBonuses(), Player::_ApplyWeaponDependentAuraDamageMod(), boss_marli::_schedulePhaseSpider(), boss_marli::_schedulePhaseTroll(), Player::ApplyEnchantment(), AuraEffect::HandleAuraIncreaseBaseHealthPercent(), AuraEffect::HandleAuraModAttackPower(), AuraEffect::HandleAuraModAttackPowerPercent(), AuraEffect::HandleAuraModBaseResistancePCT(), AuraEffect::HandleAuraModIncreaseEnergy(), AuraEffect::HandleAuraModIncreaseEnergyPercent(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), AuraEffect::HandleAuraModRangedAttackPower(), AuraEffect::HandleAuraModRangedAttackPowerPercent(), AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModResistanceExclusive(), AuraEffect::HandleAuraModStat(), AuraEffect::HandleModBaseResistance(), AuraEffect::HandleModDamageDone(), AuraEffect::HandleModDamagePercentDone(), AuraEffect::HandleModOffhandDamagePercent(), AuraEffect::HandleModPercentStat(), AuraEffect::HandleModResistancePercent(), AuraEffect::HandleModTotalPercentStat(), Guardian::InitStatsForLevel(), spell_astromancer_solarian_transform::OnApply(), spell_astromancer_solarian_transform::OnRemove(), boss_arlokk::boss_arlokkAI::Reset(), boss_marli::Reset(), and boss_arlokk::boss_arlokkAI::UpdateAI().

◆ HasActivePowerType()

◆ HasAllowOnlyAbilityAura()

bool Unit::HasAllowOnlyAbilityAura ( ) const
inline
@ SPELL_AURA_ALLOW_ONLY_ABILITY
Definition: SpellAuraDefines.h:326
bool HasAuraType(AuraType auraType) const
Definition: Unit.cpp:5705

References HasAuraType(), and SPELL_AURA_ALLOW_ONLY_ABILITY.

Referenced by AuraEffect::HandleAuraAllowOnlyAbility().

◆ HasAOECharmAura()

bool Unit::HasAOECharmAura ( ) const
inline
@ SPELL_AURA_AOE_CHARM
Definition: SpellAuraDefines.h:240

References HasAuraType(), and SPELL_AURA_AOE_CHARM.

◆ HasAttackerSpellCritChanceAura()

bool Unit::HasAttackerSpellCritChanceAura ( ) const
inline
@ SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
Definition: SpellAuraDefines.h:242

References HasAuraType(), and SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE.

Referenced by SpellTakenCritChance().

◆ HasAura()

bool Unit::HasAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5699{
5700 if (GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask))
5701 return true;
5702 return false;
5703}

References GetAuraApplication().

Referenced by boss_grand_champion::boss_grand_championAI::AddCreatureAddonAuras(), Pet::AddToWorld(), spell_warl_health_funnel::ApplyEffect(), boss_archavon::boss_archavonAI::AttackStart(), boss_emalon::boss_emalonAI::AttackStart(), boss_koralon::boss_koralonAI::AttackStart(), boss_toravon::boss_toravonAI::AttackStart(), boss_leotheras_the_blind::AttackStart(), boss_hodir::boss_hodirAI::CanAIAttack(), boss_razorgore::boss_razorgoreAI::CanAIAttack(), boss_hazzarah::CanAIAttack(), boss_jindo::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_nethermancer_sepethrea::CanAIAttack(), boss_chromaggus::boss_chromaggusAI::CanAIAttack(), npc_parasitic_shadowfiend::CanAIAttack(), npc_wg_siege_machine::npc_wg_siege_machineAI::CanControlVehicle(), Player::CanJoinToBattleground(), Player::CanResummonPet(), Player::CanUseAmmo(), Player::CanUseBattlegroundObject(), Player::CastItemCombatSpell(), spell_hun_pet_heart_of_the_phoenix::CheckCast(), Spell::CheckCast(), Spell::CheckCasterAuras(), Spell::CheckItems(), spell_pal_hand_of_sacrifice::CheckTarget(), SpellInfo::CheckTarget(), spell_hun_lock_and_load::CheckTrapProc(), npc_mc_core_hound::npc_mc_core_houndAI::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_thekal::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), boss_kalecgos::DoAction(), boss_illidan_stormrage::DoAction(), npc_midsummer_ribbon_pole_target::DoCleanupChecks(), Spell::DoCreateItem(), Spell::EffectDummy(), Spell::EffectHeal(), Spell::EffectInstaKill(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSummonPlayer(), Spell::EffectTriggerSpell(), Spell::EffectWeaponDmg(), NPCStaveQuestAI::EvadeOnFeignDeath(), IceTombSummonEvent::Execute(), PartyTimeEmoteEvent::Execute(), spell_class_call_polymorph::FilterTargets(), spell_dru_wild_growth::FilterTargets(), spell_pri_circle_of_healing::FilterTargets(), lfg::LFGMgr::FinishDungeon(), GetDispellableAuraList(), Player::GetResurrectionSpellId(), Player::GiveXP(), go_wind_stone::go_wind_stoneAI::GossipHello(), go_soulwell::go_soulwellAI::GossipHello(), spell_dk_scourge_strike::HandleAfterHit(), spell_dru_enrage::HandleApply(), BattlegroundDS::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraMounted(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), spell_thaddius_pos_neg_charge::HandleDamage(), spell_capacitus_polarity_charge::HandleDamage(), spell_mage_summon_water_elemental::HandleDummy(), spell_rog_preparation::HandleDummy(), spell_warr_charge::HandleDummy(), HandleDummyAuraProc(), spell_q12851_going_bearback::HandleEffectApply(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_dk_improved_blood_presence::HandleEffectRemove(), spell_dk_improved_frost_presence::HandleEffectRemove(), spell_dk_improved_unholy_presence::HandleEffectRemove(), Player::HandleFall(), gm_commandscript::HandleGMVisibleCommand(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_sindragosa_frost_breath::HandleInfusion(), BattlefieldWG::HandleKill(), lookup_commandscript::HandleLookupSpellCommand(), lookup_commandscript::HandleLookupSpellIdCommand(), WorldSession::HandleMessagechatOpcode(), spell_oculus_soar_aura::HandleOnEffectApply(), spell_mark_of_frost_freeze::HandleOnHit(), OPvPCapturePointZM_GraveYard::HandleOpenGo(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_garr_separation_anxiety_aura::HandlePeriodic(), spell_majordomo_separation_anxiety_aura::HandlePeriodic(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), spell_warr_vigilance::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_pal_lay_on_hands::HandleScript(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), spell_q12611_deathbolt::HandleScriptEffect(), spell_dru_glyph_of_starfire::HandleScriptEffect(), misc_commandscript::HandleUnFreezeCommand(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::InformCloud(), boss_taldaram::InitializeAI(), Player::IsDeserter(), SpellArea::IsFitToRequirements(), npc_anzu_spirit::IsSummonedBy(), go_wg_vehicle_teleporter::go_wg_vehicle_teleporterAI::IsValidVehicle(), IsVampire(), lfg::LFGMgr::JoinLfg(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustDied(), boss_professor_putricide::boss_professor_putricideAI::JustDied(), boss_sindragosa::boss_sindragosaAI::JustDied(), boss_hydross_the_unstable::JustDied(), boss_alar::JustDied(), boss_zuljin::JustEngagedWith(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::JustEngagedWith(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::JustEngagedWith(), boss_bjarngrim::boss_bjarngrimAI::JustEngagedWith(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::JustEngagedWith(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::JustEngagedWith(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::JustEngagedWith(), boss_nalorakk::JustEngagedWith(), npc_hivezara_stinger::JustEngagedWith(), boss_vem::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_hydross_the_unstable::JustEngagedWith(), npc_akama_illidan::JustReachedHome(), boss_hydross_the_unstable::JustReachedHome(), Kill(), boss_hydross_the_unstable::KilledUnit(), boss_hadronox::boss_hadronoxAI::KilledUnit(), Creature::LoadCreaturesAddon(), MeleeDamageBonusDone(), ModSpellCastTime(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::MoveInLineOfSight(), npc_custodian_of_time::npc_custodian_of_timeAI::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_daranelle::npc_daranelleAI::MoveInLineOfSight(), boss_lady_vashj::MovementInform(), boss_kagani_nightstrike::MovementInform(), achievement_staying_buffed_all_winter_10::OnCheck(), achievement_staying_buffed_all_winter_25::OnCheck(), achievement_flirt_with_disaster_perf_check::OnCheck(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_aged_dying_ancient_kodo::OnGossipHello(), npc_alchemist_adrianna::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_innkeeper::OnGossipHello(), go_manticron_cube::OnGossipHello(), go_orb_of_domination::OnGossipHello(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), instance_scarlet_monastery::instance_scarlet_monastery_InstanceMapScript::OnPlayerAreaUpdate(), instance_scarlet_monastery::instance_scarlet_monastery_InstanceMapScript::OnPlayerEnter(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerEnter(), spell_azjol_nerub_web_wrap_aura::OnRemove(), spell_icc_web_wrap_aura::OnRemove(), spell_gen_damage_reduction_aura::OnRemove(), at_karazhan_atiesh_aran::OnTrigger(), at_hor_battered_hilt_start::OnTrigger(), at_hor_battered_hilt_throw::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), at_commander_dawnforge::OnTrigger(), MidsummerPlayerScript::OnUpdateZone(), Acore::FriendlyMissingBuffInRange::operator()(), NotInStomachSelector::operator()(), SindragosaIceTombCheck::operator()(), NecroticPlagueTargetCheck::operator()(), DefaultTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), DefileTargetSelector::operator()(), WebTargetSelector::operator()(), ShadowOfDeathSelector::operator()(), Acore::UnitAuraCheck::operator()(), SpectralBlastCheck::operator()(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), Player::ReportedAfkBy(), npc_corrupted_totem::Reset(), boss_janalai::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), boss_magus_telestra::Reset(), boss_illidan_stormrage::Reset(), boss_fathomlord_karathress::Reset(), npc_pet_pri_shadowfiend::Reset(), Player::RewardHonor(), RewardRage(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_jormungarAI::ScheduleEvents(), boss_supremus::SchedulePhase(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), boss_anomalus::SetData(), npc_thassarian2::npc_thassarian2AI::sGossipHello(), npc_chesspiece::sGossipHello(), npc_omen::npc_omenAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHit(), boss_faerlina::boss_faerlinaAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::SpellHit(), npc_greengill_slave::npc_greengill_slaveAI::SpellHit(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::SpellHit(), SpellPctDamageModsDone(), SpellTakenCritChance(), Player::StoreItem(), boss_moam::SummonedCreatureDies(), boss_apothecary_hummel::boss_apothecary_hummelAI::SummonedCreatureDies(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_mc_core_hound::npc_mc_core_houndAI::UpdateAI(), npc_cyclone::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), boss_moam::UpdateAI(), boss_ossirian::UpdateAI(), boss_elder_nadox::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_ice_tomb::npc_ice_tombAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_faerlina::boss_faerlinaAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_beryl_sorcerer::npc_beryl_sorcererAI::UpdateAI(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), Player::UpdateAreaDependentAuras(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI(), boss_netherspite::UpdatePortals(), Player::UpdateZoneDependentAuras(), and Spell::WriteAmmoToPacket().

◆ HasAuraEffect()

bool Unit::HasAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  caster = ObjectGuid::Empty 
) const
5669{
5670 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5671 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5672 {
5673 if (itr->second->HasEffect(effIndex)
5674 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5675 {
5676 return true;
5677 }
5678 }
5679 return false;
5680}

References m_appliedAuras.

Referenced by Spell::CanAutoCast(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), spell_q12683_take_sputum_sample::HandleDummy(), AchievementCriteriaData::Meets(), and boss_headless_horseman::UpdateAI().

◆ HasAuraState()

bool Unit::HasAuraState ( AuraStateType  flag,
SpellInfo const *  spellProto = nullptr,
Unit const *  Caster = nullptr 
) const
10548{
10549 if (Caster)
10550 {
10551 if (spellProto)
10552 {
10553 AuraEffectList const& stateAuras = Caster->GetAuraEffectsByType(SPELL_AURA_ABILITY_IGNORE_AURASTATE);
10554 for (AuraEffectList::const_iterator j = stateAuras.begin(); j != stateAuras.end(); ++j)
10555 if ((*j)->IsAffectedOnSpell(spellProto))
10556 return true;
10557 }
10558 // Check per caster aura state
10559 // If aura with aurastate by caster not found return false
10560 if ((1 << (flag - 1)) & PER_CASTER_AURA_STATE_MASK)
10561 {
10562 AuraStateAurasMapBounds range = m_auraStateAuras.equal_range(flag);
10563 for (AuraStateAurasMap::const_iterator itr = range.first; itr != range.second; ++itr)
10564 if (itr->second->GetBase()->GetCasterGUID() == Caster->GetGUID())
10565 return true;
10566 return false;
10567 }
10568 }
10569
10570 return HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10571}
@ SPELL_AURA_ABILITY_IGNORE_AURASTATE
Definition: SpellAuraDefines.h:325
std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
Definition: Unit.h:644

References GetAuraEffectsByType(), Object::GetGUID(), Object::HasFlag(), m_auraStateAuras, PER_CASTER_AURA_STATE_MASK, SPELL_AURA_ABILITY_IGNORE_AURASTATE, and UNIT_FIELD_AURASTATE.

Referenced by Player::_addSpell(), Pet::addSpell(), Spell::CheckCast(), spell_sha_earthliving_weapon::CheckProc(), SpellInfo::CheckTarget(), ClearAllReactives(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), spell_warr_sweeping_strikes::HandleProc(), HandleProcTriggerSpell(), isFrozen(), Player::LoadFromDB(), MeleeDamageBonusDone(), SpellPctDamageModsDone(), SpellTakenCritChance(), and UpdateReactives().

◆ HasAuraType()

bool Unit::HasAuraType ( AuraType  auraType) const
5706{
5707 return (!m_modAuras[auraType].empty());
5708}

References m_modAuras.

Referenced by Player::CanTameExoticPets(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraEmpathy(), AuraEffect::HandleAuraFeatherFall(), AuraEffect::HandleAuraHover(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModStalked(), AuraEffect::HandleAuraTrackStealthed(), AuraEffect::HandleAuraUntrackable(), AuraEffect::HandleAuraWaterWalk(), AuraEffect::HandleComprehendLanguage(), AuraEffect::HandleForceMoveForward(), HasAllowOnlyAbilityAura(), HasAOECharmAura(), HasAttackerSpellCritChanceAura(), HasAuraTypeWithFamilyFlags(), HasCloneCasterAura(), HasConfuseAura(), HasControlVehicleAura(), HasDecreaseSpeedAura(), HasDetectAmoreAura(), HasDetectSpellsAura(), HasFearAura(), HasFeatherFallAura(), HasFlyAura(), HasGhostAura(), HasHealthRegenInCombatAura(), HasHoverAura(), HasIgnoreHitDirectionAura(), HasIgnoreTargetResistAura(), HasIncreaseMountedFlightSpeedAura(), HasIncreaseMountedSpeedAura(), HasInterruptRegenAura(), HasInvisibilityAura(), HasInvisibilityDetectAura(), HasMountedAura(), HasNoPVPCreditAura(), HasOpenStableAura(), HasPacifyAura(), HasPacifySilenceAura(), HasPeriodicDummyAura(), HasPreventDurabilityLossAura(), HasPreventResurectionAura(), HasPreventsFleeingAura(), HasReflectSpellsAura(), HasRegenDuringCombatAura(), HasRootAura(), HasShapeshiftAura(), HasSilenceAura(), HasSpellMagnetAura(), HasSpiritOfRedemptionAura(), HasStealthAura(), HasStealthDetectAura(), HasStunAura(), HasTauntAura(), HasThreatAura(), HasTransformAura(), HasUnattackableAura(), HasWaterBreathingAura(), and HasWaterWalkAura().

◆ HasAuraTypeWithAffectMask()

bool Unit::HasAuraTypeWithAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
5739{
5740 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5741 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5742 if ((*i)->IsAffectedOnSpell(affectedSpell))
5743 return true;
5744 return false;
5745}

References GetAuraEffectsByType().

Referenced by AuraEffect::CalculatePeriodic(), Spell::DoSpellHitOnUnit(), Spell::handle_immediate(), Aura::RefreshDuration(), and Aura::RefreshTimersWithMods().

◆ HasAuraTypeWithCaster()

bool Unit::HasAuraTypeWithCaster ( AuraType  auratype,
ObjectGuid  caster 
) const
5711{
5712 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5713 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5714 if (caster == (*i)->GetCasterGUID())
5715 return true;
5716 return false;
5717}

References GetAuraEffectsByType().

Referenced by BuildValuesUpdate(), IsAlwaysDetectableFor(), PatchValuesUpdate(), and ThreatContainer::SelectNextVictim().

◆ HasAuraTypeWithFamilyFlags()

bool Unit::HasAuraTypeWithFamilyFlags ( AuraType  auraType,
uint32  familyName,
uint32  familyFlags 
) const
766{
767 if (!HasAuraType(auraType))
768 return false;
769 AuraEffectList const& auras = GetAuraEffectsByType(auraType);
770 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
771 if (SpellInfo const* iterSpellProto = (*itr)->GetSpellInfo())
772 if (iterSpellProto->SpellFamilyName == familyName && iterSpellProto->SpellFamilyFlags[0] & familyFlags)
773 return true;
774 return false;
775}

References GetAuraEffectsByType(), and HasAuraType().

◆ HasAuraTypeWithMiscvalue()

bool Unit::HasAuraTypeWithMiscvalue ( AuraType  auratype,
int32  miscvalue 
) const
5730{
5731 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5732 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5733 if (miscvalue == (*i)->GetMiscValue())
5734 return true;
5735 return false;
5736}

References GetAuraEffectsByType().

Referenced by Player::Regenerate(), Player::UpdateManaRegen(), and Player::UpdateStats().

◆ HasAuraTypeWithTriggerSpell()

bool Unit::HasAuraTypeWithTriggerSpell ( AuraType  auratype,
uint32  triggerSpell 
) const
5757{
5758 for (AuraEffect const* aura : GetAuraEffectsByType(auratype))
5759 {
5760 if (aura->GetSpellInfo()->Effects[aura->GetEffIndex()].TriggerSpell == triggerSpell)
5761 {
5762 return true;
5763 }
5764 }
5765
5766 return false;
5767}

References GetAuraEffectsByType().

Referenced by WorldSession::HandlePetActionHelper().

◆ HasAuraTypeWithValue()

bool Unit::HasAuraTypeWithValue ( AuraType  auratype,
int32  value 
) const
5748{
5749 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5750 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5751 if (value == (*i)->GetAmount())
5752 return true;
5753 return false;
5754}

References GetAuraEffectsByType().

◆ HasAuraWithMechanic()

bool Unit::HasAuraWithMechanic ( uint32  mechanicMask) const
5793{
5794 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5795 {
5796 SpellInfo const* spellInfo = iter->second->GetBase()->GetSpellInfo();
5797 if (spellInfo->Mechanic && (mechanicMask & (1 << spellInfo->Mechanic)))
5798 return true;
5799
5800 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5801 if (iter->second->HasEffect(i) && spellInfo->Effects[i].Effect && spellInfo->Effects[i].Mechanic)
5802 if (mechanicMask & (1 << spellInfo->Effects[i].Mechanic))
5803 return true;
5804 }
5805
5806 return false;
5807}

References SpellInfo::Effects, m_appliedAuras, MAX_SPELL_EFFECTS, and SpellInfo::Mechanic.

Referenced by EarthenPowerTargetSelector::operator()(), SpellPctDamageModsDone(), and SpellTakenCritChance().

◆ HasBreakableByDamageAuraType()

bool Unit::HasBreakableByDamageAuraType ( AuraType  type,
uint32  excludeAura = 0 
) const
778{
779 AuraEffectList const& auras = GetAuraEffectsByType(type);
780 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
781 if ((!excludeAura || excludeAura != (*itr)->GetSpellInfo()->Id) && //Avoid self interrupt of channeled Crowd Control spells like Seduction
782 ((*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE))
783 return true;
784 return false;
785}

References AURA_INTERRUPT_FLAG_TAKE_DAMAGE, and GetAuraEffectsByType().

Referenced by HasBreakableByDamageCrowdControlAura().

◆ HasBreakableByDamageCrowdControlAura()

bool Unit::HasBreakableByDamageCrowdControlAura ( Unit excludeCasterChannel = nullptr) const
788{
789 uint32 excludeAura = 0;
790 if (Spell* currentChanneledSpell = excludeCasterChannel ? excludeCasterChannel->GetCurrentSpell(CURRENT_CHANNELED_SPELL) : nullptr)
791 excludeAura = currentChanneledSpell->GetSpellInfo()->Id; //Avoid self interrupt of channeled Crowd Control spells like Seduction
792
798}
@ SPELL_AURA_MOD_FEAR
Definition: SpellAuraDefines.h:70
@ SPELL_AURA_MOD_ROOT
Definition: SpellAuraDefines.h:89
@ SPELL_AURA_TRANSFORM
Definition: SpellAuraDefines.h:119
@ SPELL_AURA_MOD_CONFUSE
Definition: SpellAuraDefines.h:68
@ SPELL_AURA_MOD_STUN
Definition: SpellAuraDefines.h:75
bool HasBreakableByDamageAuraType(AuraType type, uint32 excludeAura=0) const
Definition: Unit.cpp:777
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
Definition: Unit.h:1449

References CURRENT_CHANNELED_SPELL, GetCurrentSpell(), HasBreakableByDamageAuraType(), SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, and SPELL_AURA_TRANSFORM.

Referenced by PetAI::CanAttack(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), CasterAI::UpdateAI(), npc_pet_gen_valkyr_guardian::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), and PetAI::UpdateAI().

◆ HasCloneCasterAura()

bool Unit::HasCloneCasterAura ( ) const
inline
@ SPELL_AURA_CLONE_CASTER
Definition: SpellAuraDefines.h:310

References HasAuraType(), and SPELL_AURA_CLONE_CASTER.

Referenced by WorldSession::HandleMirrorImageDataRequest().

◆ HasConfuseAura()

bool Unit::HasConfuseAura ( ) const
inline

◆ HasControlVehicleAura()

bool Unit::HasControlVehicleAura ( ) const
inline

◆ HasDecreaseSpeedAura()

bool Unit::HasDecreaseSpeedAura ( ) const
inline

◆ HasDetectAmoreAura()

bool Unit::HasDetectAmoreAura ( ) const
inline
@ SPELL_AURA_DETECT_AMORE
Definition: SpellAuraDefines.h:233

References HasAuraType(), and SPELL_AURA_DETECT_AMORE.

Referenced by AuraEffect::HandleDetectAmore().

◆ HasDetectSpellsAura()

bool Unit::HasDetectSpellsAura ( ) const
inline
@ SPELL_AURA_DEFLECT_SPELLS
Definition: SpellAuraDefines.h:350

References HasAuraType(), and SPELL_AURA_DEFLECT_SPELLS.

◆ HasExtraUnitMovementFlag()

uint16 Unit::HasExtraUnitMovementFlag ( uint16  f) const
inline

◆ HasFearAura()

◆ HasFeatherFallAura()

bool Unit::HasFeatherFallAura ( ) const
inline
@ SPELL_AURA_FEATHER_FALL
Definition: SpellAuraDefines.h:168

References HasAuraType(), and SPELL_AURA_FEATHER_FALL.

Referenced by Player::GetAurasForTarget(), and Player::HandleFall().

◆ HasFlyAura()

◆ HasGhostAura()

bool Unit::HasGhostAura ( ) const
inline
1659{ return HasAuraType(SPELL_AURA_GHOST); };
@ SPELL_AURA_GHOST
Definition: SpellAuraDefines.h:158

References HasAuraType(), and SPELL_AURA_GHOST.

Referenced by SpellInfo::CheckTarget(), AuraEffect::HandleAuraGhost(), and Acore::AnyDeadUnitObjectInRangeCheck::operator()().

◆ HasHealthRegenInCombatAura()

bool Unit::HasHealthRegenInCombatAura ( ) const
inline
@ SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT
Definition: SpellAuraDefines.h:224

References HasAuraType(), and SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT.

Referenced by Player::RegenerateAll().

◆ HasHoverAura()

bool Unit::HasHoverAura ( ) const
inline
1663{ return HasAuraType(SPELL_AURA_HOVER); };
@ SPELL_AURA_HOVER
Definition: SpellAuraDefines.h:169

References HasAuraType(), and SPELL_AURA_HOVER.

Referenced by Player::GetAurasForTarget(), Player::HandleFall(), and Creature::UpdateMovementFlags().

◆ HasIgnoreHitDirectionAura()

bool Unit::HasIgnoreHitDirectionAura ( ) const
inline
@ SPELL_AURA_IGNORE_HIT_DIRECTION
Definition: SpellAuraDefines.h:351

References HasAuraType(), and SPELL_AURA_IGNORE_HIT_DIRECTION.

Referenced by isSpellBlocked(), MagicSpellHitResult(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ HasIgnoreTargetResistAura()

bool Unit::HasIgnoreTargetResistAura ( ) const
inline

◆ HasIncreaseMountedFlightSpeedAura()

◆ HasIncreaseMountedSpeedAura()

bool Unit::HasIncreaseMountedSpeedAura ( ) const
inline
@ SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED
Definition: SpellAuraDefines.h:95

References HasAuraType(), and SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED.

◆ HasInterruptRegenAura()

bool Unit::HasInterruptRegenAura ( ) const
inline
@ SPELL_AURA_INTERRUPT_REGEN
Definition: SpellAuraDefines.h:157

References HasAuraType(), and SPELL_AURA_INTERRUPT_REGEN.

Referenced by Player::Regenerate().

◆ HasInvisibilityAura()

bool Unit::HasInvisibilityAura ( ) const
inline

◆ HasInvisibilityDetectAura()

bool Unit::HasInvisibilityDetectAura ( ) const
inline
@ SPELL_AURA_MOD_INVISIBILITY_DETECT
Definition: SpellAuraDefines.h:82

References HasAuraType(), and SPELL_AURA_MOD_INVISIBILITY_DETECT.

Referenced by AuraEffect::HandleModInvisibilityDetect().

◆ HasMainhandWeapon()

bool Unit::HasMainhandWeapon ( ) const
inline
927{ return HasWeapon(BASE_ATTACK); }
virtual bool HasWeapon(WeaponAttackType type) const =0

References BASE_ATTACK, and HasWeapon().

◆ hasMainhandWeaponForAttack()

bool Unit::hasMainhandWeaponForAttack ( ) const
inline
virtual bool HasWeaponForAttack(WeaponAttackType type) const
Definition: Unit.h:932

References BASE_ATTACK, and HasWeaponForAttack().

◆ HasMainhandWeaponForAttack()

bool Unit::HasMainhandWeaponForAttack ( ) const
inline

◆ HasMountedAura()

◆ HasNegativeAuraWithAttribute()

bool Unit::HasNegativeAuraWithAttribute ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5782{
5783 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5784 {
5785 Aura const* aura = iter->second->GetBase();
5786 if (!iter->second->IsPositive() && aura->GetSpellInfo()->Attributes & flag && (!guid || aura->GetCasterGUID() == guid))
5787 return true;
5788 }
5789 return false;
5790}
uint32 Attributes
Definition: SpellInfo.h:324

References SpellInfo::Attributes, Aura::GetCasterGUID(), Aura::GetSpellInfo(), and m_appliedAuras.

◆ HasNegativeAuraWithInterruptFlag()

bool Unit::HasNegativeAuraWithInterruptFlag ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5770{
5771 if (!(m_interruptMask & flag))
5772 return false;
5773 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end(); ++iter)
5774 {
5775 if (!(*iter)->IsPositive() && (*iter)->GetBase()->GetSpellInfo()->AuraInterruptFlags & flag && (!guid || (*iter)->GetBase()->GetCasterGUID() == guid))
5776 return true;
5777 }
5778 return false;
5779}

References m_interruptableAuras, and m_interruptMask.

Referenced by ThreatContainer::SelectNextVictim().

◆ HasNoPVPCreditAura()

bool Unit::HasNoPVPCreditAura ( ) const
inline
@ SPELL_AURA_NO_PVP_CREDIT
Definition: SpellAuraDefines.h:222

References HasAuraType(), and SPELL_AURA_NO_PVP_CREDIT.

Referenced by Player::RewardHonor().

◆ HasNpcFlag()

bool Unit::HasNpcFlag ( NPCFlags  flags) const
inline

◆ HasOffhandWeapon()

bool Unit::HasOffhandWeapon ( ) const
inline
928{ return HasWeapon(OFF_ATTACK); }

References HasWeapon(), and OFF_ATTACK.

◆ HasOffhandWeaponForAttack()

◆ HasOpenStableAura()

bool Unit::HasOpenStableAura ( ) const
inline
@ SPELL_AURA_OPEN_STABLE
Definition: SpellAuraDefines.h:355

References HasAuraType(), and SPELL_AURA_OPEN_STABLE.

◆ HasPacifyAura()

bool Unit::HasPacifyAura ( ) const
inline
@ SPELL_AURA_MOD_PACIFY
Definition: SpellAuraDefines.h:88

References HasAuraType(), and SPELL_AURA_MOD_PACIFY.

Referenced by AuraEffect::HandleAuraModPacify(), and WorldSession::HandlePetActionHelper().

◆ HasPacifySilenceAura()

bool Unit::HasPacifySilenceAura ( ) const
inline

◆ HasPeriodicDummyAura()

bool Unit::HasPeriodicDummyAura ( ) const
inline

◆ HasPreventDurabilityLossAura()

bool Unit::HasPreventDurabilityLossAura ( ) const
inline
@ SPELL_AURA_PREVENT_DURABILITY_LOSS
Definition: SpellAuraDefines.h:352

References HasAuraType(), and SPELL_AURA_PREVENT_DURABILITY_LOSS.

Referenced by Player::DurabilityPointsLoss().

◆ HasPreventResurectionAura()

bool Unit::HasPreventResurectionAura ( ) const
inline

◆ HasPreventsFleeingAura()

bool Unit::HasPreventsFleeingAura ( ) const
inline
@ SPELL_AURA_PREVENTS_FLEEING
Definition: SpellAuraDefines.h:155

References HasAuraType(), and SPELL_AURA_PREVENTS_FLEEING.

Referenced by Creature::DoFleeToGetAssistance().

◆ HasRangedWeapon()

bool Unit::HasRangedWeapon ( ) const
inline
929{ return HasWeapon(RANGED_ATTACK); }

References HasWeapon(), and RANGED_ATTACK.

◆ HasRangedWeaponForAttack()

bool Unit::HasRangedWeaponForAttack ( ) const
inline

◆ HasReflectSpellsAura()

bool Unit::HasReflectSpellsAura ( ) const
inline
@ SPELL_AURA_REFLECT_SPELLS
Definition: SpellAuraDefines.h:91

References HasAuraType(), and SPELL_AURA_REFLECT_SPELLS.

Referenced by Spell::DoSpellHitOnUnit().

◆ HasRegenDuringCombatAura()

bool Unit::HasRegenDuringCombatAura ( ) const
inline
@ SPELL_AURA_MOD_REGEN_DURING_COMBAT
Definition: SpellAuraDefines.h:179

References HasAuraType(), and SPELL_AURA_MOD_REGEN_DURING_COMBAT.

Referenced by Player::RegenerateAll(), and Player::RegenerateHealth().

◆ HasRootAura()

bool Unit::HasRootAura ( ) const
inline

◆ HasShapeshiftAura()

bool Unit::HasShapeshiftAura ( ) const
inline

◆ HasSharedVision()

◆ HasSilenceAura()

bool Unit::HasSilenceAura ( ) const
inline

◆ HasSpell()

virtual bool Unit::HasSpell ( uint32  ) const
inlinevirtual

◆ HasSpellCooldown()

◆ HasSpellItemCooldown()

virtual bool Unit::HasSpellItemCooldown ( uint32  ,
uint32   
) const
inlinevirtual

Reimplemented in Player.

1261{ return false; }

Referenced by Spell::CheckCast(), and ProcDamageAndSpellFor().

◆ HasSpellMagnetAura()

bool Unit::HasSpellMagnetAura ( ) const
inline

◆ HasSpiritOfRedemptionAura()

◆ HasStealthAura()

◆ HasStealthDetectAura()

bool Unit::HasStealthDetectAura ( ) const
inline
@ SPELL_AURA_MOD_STEALTH_DETECT
Definition: SpellAuraDefines.h:80

References HasAuraType(), and SPELL_AURA_MOD_STEALTH_DETECT.

Referenced by AuraEffect::HandleModStealthDetect().

◆ HasStunAura()

bool Unit::HasStunAura ( ) const
inline

◆ HasTauntAura()

bool Unit::HasTauntAura ( ) const
inline
@ SPELL_AURA_MOD_TAUNT
Definition: SpellAuraDefines.h:74

References HasAuraType(), and SPELL_AURA_MOD_TAUNT.

Referenced by Creature::CanCreatureAttack(), and PetAI::SelectNextTarget().

◆ HasThreatAura()

bool Unit::HasThreatAura ( ) const
inline
@ SPELL_AURA_MOD_THREAT
Definition: SpellAuraDefines.h:73

References HasAuraType(), and SPELL_AURA_MOD_THREAT.

Referenced by ApplyTotalThreatModifier().

◆ HasTransformAura()

bool Unit::HasTransformAura ( ) const
inline

◆ HasUnattackableAura()

bool Unit::HasUnattackableAura ( ) const
inline

◆ HasUnitFlag()

bool Unit::HasUnitFlag ( UnitFlags  flags) const
inline
712{ return HasFlag(UNIT_FIELD_FLAGS, flags); }

References Object::HasFlag(), and UNIT_FIELD_FLAGS.

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), Vehicle::AddPassenger(), AttackerStateUpdate(), boss_malygos::boss_malygosAI::AttackStart(), SmartAI::AttackStart(), npc_ghostly_priest::npc_ghostly_priestAI::AttackStart(), npc_phantom_mage::npc_phantom_mageAI::AttackStart(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::AttackStart(), npc_spectral_footman::npc_spectral_footmanAI::AttackStart(), npc_tortured_rifleman::npc_tortured_riflemanAI::AttackStart(), violet_hold_trashAI::AttackStart(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::AttackStart(), npc_ravenous_worg::npc_ravenous_worgAI::AttackStart(), npc_swarm_scarab::npc_swarm_scarabAI::CanAIAttack(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), Creature::CanAssistTo(), PetAI::CanAttack(), Player::CanNoReagentCast(), CanSwim(), CanUseAttackType(), Spell::CheckEffectTarget(), boss_muru::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_jormungarAI::DoAction(), Spell::DoSpellHitOnUnit(), RandomMovementGenerator< T >::DoUpdate(), boss_dorothee::EnterEvadeMode(), boss_roar::EnterEvadeMode(), boss_strawman::EnterEvadeMode(), boss_tinhead::EnterEvadeMode(), boss_julianne::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GetReactionTo(), GetVelocity(), spell_gen_model_visible::HandleEffectApply(), WorldSession::HandleMovementOpcodes(), spell_gen_mounted_charge::HandleScriptEffect(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsMounted(), IsPetInCombat(), isTargetableForAttack(), violet_hold_trashAI::JustEngagedWith(), boss_novos::boss_novosAI::JustSummoned(), Condition::Meets(), MotionMaster::MoveCharge(), MotionMaster::MoveChase(), MotionMaster::MoveConfused(), MotionMaster::MoveDistract(), MotionMaster::MoveFall(), MotionMaster::MoveFleeing(), MotionMaster::MoveFollow(), boss_professor_putricide::boss_professor_putricideAI::MoveInLineOfSight(), boss_palehoof::boss_palehoofAI::MoveInLineOfSight(), npc_massive_jormungar::npc_massive_jormungarAI::MoveInLineOfSight(), npc_ferocious_rhino::npc_ferocious_rhinoAI::MoveInLineOfSight(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::MoveInLineOfSight(), npc_frenzied_worgen::npc_frenzied_worgenAI::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), npc_nether_drake::npc_nether_drakeAI::MoveInLineOfSight(), MotionMaster::MoveLand(), MotionMaster::MovePath(), MotionMaster::MovePoint(), MotionMaster::MoveRandom(), MotionMaster::MoveSeekAssistance(), MotionMaster::MoveSeekAssistanceDistract(), MotionMaster::MoveSplinePath(), MotionMaster::MoveTakeoff(), MotionMaster::MoveTargetedHome(), npc_toc_druid::npc_toc_druidAI::myCanCast(), npc_toc_shaman::npc_toc_shamanAI::myCanCast(), npc_toc_paladin::npc_toc_paladinAI::myCanCast(), npc_toc_priest::npc_toc_priestAI::myCanCast(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::myCanCast(), npc_toc_warlock::npc_toc_warlockAI::myCanCast(), npc_toc_mage::npc_toc_mageAI::myCanCast(), npc_toc_boomkin::npc_toc_boomkinAI::myCanCast(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::myCanCast(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), Creature::reachWithSpellAttack(), Creature::reachWithSpellCure(), Creature::RefreshSwimmingFlag(), ScriptedAI::SelectSpell(), Player::SetClientControl(), SetSpeed(), boss_the_lurker_below::SummonedCreatureDies(), Player::Update(), npc_onyxian_lair_guard::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::UpdateAI(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_xt002_heart::npc_xt002_heartAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_ravenous_worg::npc_ravenous_worgAI::UpdateAI(), and Player::UpdateTriggerVisibility().

◆ HasUnitFlag2()

◆ HasUnitMovementFlag()

◆ HasUnitState()

bool Unit::HasUnitState ( const uint32  f) const
inline
701{ return (m_state & f); }

References m_state.

Referenced by Spell::_cast(), Creature::_IsTargetAcceptable(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), AddThreat(), advisor_baseAI::advisor_baseAI(), Attack(), AttackerStateUpdate(), FollowerAI::AttackStart(), npc_raging_spirit::npc_raging_spiritAI::AttackStart(), boss_alar::boss_alar(), boss_anetheron::boss_anetheron(), boss_anzu::boss_anzu(), boss_apothecary_hummel::boss_apothecary_hummelAI::boss_apothecary_hummelAI(), boss_archimonde::boss_archimonde(), boss_azgalor::boss_azgalor(), boss_azuregos::boss_azuregosAI::boss_azuregosAI(), boss_balinda::boss_balinda(), boss_bigbadwolf::boss_bigbadwolf(), boss_blackheart_the_inciter::boss_blackheart_the_inciter(), boss_blindeye_the_seer::boss_blindeye_the_seer(), boss_captain_skarloc::boss_captain_skarloc(), boss_curator::boss_curator(), boss_darkweaver_syth::boss_darkweaver_syth(), boss_dorothee::boss_dorothee(), boss_exarch_maladaar::boss_exarch_maladaar(), boss_fathomguard_caribdis::boss_fathomguard_caribdis(), boss_fathomguard_sharkkis::boss_fathomguard_sharkkis(), boss_fathomguard_tidalvess::boss_fathomguard_tidalvess(), boss_ghazan::boss_ghazan(), boss_grand_warlock_nethekurse::boss_grand_warlock_nethekurse(), boss_halazzi::boss_halazzi(), boss_high_astromancer_solarian::boss_high_astromancer_solarian(), boss_high_king_maulgar::boss_high_king_maulgar(), boss_janalai::boss_janalai(), boss_jarien::boss_jarien(), boss_kazrogal::boss_kazrogal(), boss_kelidan_the_breaker::boss_kelidan_the_breaker(), boss_kiggler_the_crazed::boss_kiggler_the_crazed(), boss_krosh_firehand::boss_krosh_firehand(), boss_lady_vashj::boss_lady_vashj(), boss_magtheridon::boss_magtheridon(), boss_maiden_of_virtue::boss_maiden_of_virtue(), boss_mekgineer_steamrigger::boss_mekgineer_steamrigger(), boss_mennu_the_betrayer::boss_mennu_the_betrayer(), boss_mor_grayhoof::boss_mor_grayhoof(), boss_moroes::boss_moroes(), boss_morogrim_tidewalker::boss_morogrim_tidewalker(), boss_murmur::boss_murmur(), boss_nazan::boss_nazan(), boss_nexusprince_shaffar::boss_nexusprince_shaffar(), boss_olm_the_summoner::boss_olm_the_summoner(), boss_omor_the_unscarred::boss_omor_the_unscarred(), boss_pandemonius::boss_pandemonius(), boss_quagmirran::boss_quagmirran(), boss_rage_winterchill::boss_rage_winterchill(), boss_roar::boss_roar(), boss_rokmar_the_crackler::boss_rokmar_the_crackler(), boss_shirrak_the_dead_watcher::boss_shirrak_the_dead_watcher(), boss_sothos::boss_sothos(), boss_strawman::boss_strawman(), boss_supremus::boss_supremus(), boss_swamplord_muselek::boss_swamplord_muselek(), boss_talon_king_ikiss::boss_talon_king_ikiss(), boss_tavarok::boss_tavarok(), boss_terestian_illhoof::boss_terestian_illhoof(), boss_the_black_stalker::boss_the_black_stalker(), boss_the_maker::boss_the_maker(), boss_tinhead::boss_tinhead(), boss_vazruden::boss_vazruden(), boss_void_reaver::boss_void_reaver(), boss_warbringer_omrogg::boss_warbringer_omrogg(), boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefist(), boss_watchkeeper_gargolmar::boss_watchkeeper_gargolmar(), PathGenerator::CalculatePath(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), boss_gurtogg_bloodboil::CanAIAttack(), PetAI::CanAttack(), Player::CanEquipItem(), CanFreeMove(), Creature::CanPeriodicallyCallForAssistance(), Creature::CanStartAttack(), spell_dk_death_grip::CheckCast(), Spell::CheckCast(), Spell::CheckPetCast(), spell_warr_retaliation::CheckProc(), SpellInfo::CheckTarget(), CreatureUnitRelocationWorker(), boss_garfrost::boss_garfrostAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), DealDamage(), DealMeleeDamage(), DisableRotate(), UnitAI::DoCast(), UnitAI::DoCastAOE(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), Spell::DoSpellHitOnUnit(), WaypointMovementGenerator< Creature >::DoUpdate(), RandomMovementGenerator< T >::DoUpdate(), Spell::EffectDistract(), Spell::EffectEnergize(), Spell::EffectHealMaxHealth(), Spell::EffectKnockBack(), CritterAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), Spell::finish(), Player::GetInitialVisiblePackets(), WorldSession::HandleAuctionListItems(), spell_dru_starfall_dummy::HandleDummy(), WorldSession::HandleEmoteOpcode(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleMoveTeleportAck(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), AuraEffect::HandleProcTriggerDamageAuraProc(), ArenaSpectator::HandleSpectatorSpectateCommand(), boss_venoxis::InitializeAI(), isAttackingPlayer(), boss_faction_championsAI::IsCCed(), Creature::IsInEvadeMode(), IsInFlight(), IsMovementPreventedByCasting(), Creature::IsMovementPreventedByCasting(), isPossessed(), isPossessedByPlayer(), isSpellBlocked(), IsStopped(), isTargetableForAttack(), IsValidCombatTarget(), CritterAI::JustEngagedWith(), boss_priestess_delrissa::JustEngagedWith(), npc_coren_direbrew_sisters::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), boss_essence_of_desire::boss_essence_of_desireAI::JustEngagedWith(), boss_priestess_lackey_commonAI::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), PetAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), LoadHelper(), MagicSpellHitResult(), MeleeSpellHitResult(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), boss_kaelthas::MovementInform(), npc_toc_druid::npc_toc_druidAI::myCanCast(), npc_toc_shaman::npc_toc_shamanAI::myCanCast(), npc_toc_paladin::npc_toc_paladinAI::myCanCast(), npc_toc_priest::npc_toc_priestAI::myCanCast(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::myCanCast(), npc_toc_warlock::npc_toc_warlockAI::myCanCast(), npc_toc_mage::npc_toc_mageAI::myCanCast(), npc_toc_hunter::npc_toc_hunterAI::myCanCast(), npc_toc_boomkin::npc_toc_boomkinAI::myCanCast(), npc_toc_warrior::npc_toc_warriorAI::myCanCast(), npc_toc_dk::npc_toc_dkAI::myCanCast(), npc_toc_rogue::npc_toc_rogueAI::myCanCast(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::myCanCast(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::myCanCast(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_apothecary_baxter::npc_apothecary_baxter(), npc_batrider::npc_batrider(), npc_hyjal_frost_wyrm::npc_hyjal_frost_wyrm(), npc_hyjal_gargoyle::npc_hyjal_gargoyle(), npc_hyjal_ground_trash::npc_hyjal_ground_trash(), npc_icc_spire_frostwyrm::npc_icc_spire_frostwyrm(), npc_inner_demon::npc_inner_demon(), npc_kiljaeden_controller::npc_kiljaeden_controller(), Acore::FriendlyCCedInRange::operator()(), SmartScript::ProcessAction(), RemoveCharmedBy(), boss_kormok::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), npc_ohgan::npc_ohganAI::Reset(), boss_thekal::Reset(), npc_zealot_lorkhan::Reset(), npc_zealot_zath::Reset(), boss_isalien::Reset(), npc_anubisath_guardian::Reset(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::Reset(), npc_ashtongue_channeler::Reset(), RollMeleeOutcomeAgainst(), boss_faction_championsAI::SelectEnemyCaster(), Player::SetClientControl(), SetContestedPvP(), SetControlled(), Creature::SetDisableGravity(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), Creature::SetHover(), SetInCombatState(), SetInFront(), SetRooted(), SetStunned(), WaypointMovementGenerator< Creature >::StartMove(), lfg::LFGMgr::TeleportPlayer(), CreatureAI::TriggerAlert(), Player::Update(), Update(), TimedFleeingMovementGenerator::Update(), boss_sartharion_dragonAI::UpdateAI(), CombatAI::UpdateAI(), CasterAI::UpdateAI(), BossAI::UpdateAI(), WorldBossAI::UpdateAI(), npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::UpdateAI(), ironhand_guardian::ironhand_guardianAI::UpdateAI(), boss_anubshiah::boss_anubshiahAI::UpdateAI(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::UpdateAI(), boss_eviscerator::boss_evisceratorAI::UpdateAI(), boss_gorosh_the_dervish::boss_gorosh_the_dervishAI::UpdateAI(), boss_grizzle::boss_grizzleAI::UpdateAI(), boss_hedrum::boss_hedrumAI::UpdateAI(), boss_moira_bronzebeardAI::UpdateAI(), boss_high_priestess_thaurissanAI::UpdateAI(), boss_okthor::boss_okthorAI::UpdateAI(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_halycon::boss_halyconAI::UpdateAI(), boss_highlord_omokk::boss_highlordomokkAI::UpdateAI(), boss_lord_valthalak::boss_lord_valthalakAI::UpdateAI(), boss_overlord_wyrmthalak::boss_overlordwyrmthalakAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_solakar_flamewreath::boss_solakar_flamewreathAI::UpdateAI(), boss_the_beast::boss_thebeastAI::UpdateAI(), boss_urok_doomhowl::boss_urok_doomhowlAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_chromaggus::boss_chromaggusAI::UpdateAI(), boss_ebonroc::boss_ebonrocAI::UpdateAI(), boss_firemaw::boss_firemawAI::UpdateAI(), boss_flamegor::boss_flamegorAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_nefarian::UpdateAI(), boss_razorgore::boss_razorgoreAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_garr::boss_garrAI::UpdateAI(), boss_golemagg::boss_golemaggAI::UpdateAI(), npc_core_rager::npc_core_ragerAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_flamewaker_priest::npc_flamewaker_priestAI::UpdateAI(), npc_mc_core_hound::npc_mc_core_houndAI::UpdateAI(), boss_netherspite::UpdateAI(), boss_servant_quarters::UpdateAI(), npc_kilrek::UpdateAI(), boss_priestess_lackey_commonAI::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::UpdateAI(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::UpdateAI(), boss_blight_worm::boss_blight_wormAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_grilek::boss_grilekAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), boss_hazzarah::UpdateAI(), boss_jindo::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_wushoolay::boss_wushoolayAI::UpdateAI(), npc_coren_direbrew::UpdateAI(), npc_hallows_end_soh::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_meathook::boss_meathookAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_lieutenant_drake::UpdateAI(), boss_onyxia::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), npc_belnistrasz::npc_belnistraszAI::UpdateAI(), npc_shadowpriest_sezziz::npc_shadowpriest_sezzizAI::UpdateAI(), boss_elder_nadox::UpdateAI(), boss_volazj::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), boss_taldaram::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_krik_thir::boss_krik_thirAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_eadric::boss_eadricAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_ghostly_priest::npc_ghostly_priestAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), boss_frostsworn_general::boss_frostsworn_generalAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), npc_gunship_boarding_add::npc_gunship_boarding_add_realAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::UpdateAI(), npc_rotting_frost_giant::npc_rotting_frost_giantAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_captain_arnath::npc_captain_arnathAI::UpdateAI(), npc_captain_brandon::npc_captain_brandonAI::UpdateAI(), npc_captain_grondel::npc_captain_grondelAI::UpdateAI(), npc_captain_rupert::npc_captain_rupertAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_faerlina::boss_faerlinaAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_loatheb::boss_loathebAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_razuvious_minion::boss_razuvious_minionAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), npc_scion_of_eternity::npc_scion_of_eternityAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), boss_drakos::boss_drakosAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_sjonnir::boss_sjonnirAI::UpdateAI(), boss_sjonnir_iron_sludge::boss_sjonnir_iron_sludgeAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_yoggsaron_constrictor_tentacle::boss_yoggsaron_constrictor_tentacleAI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_dalronn_the_controller::UpdateAI(), npc_enslaved_proto_drake::UpdateAI(), npc_massive_jormungar::npc_massive_jormungarAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_archavon::boss_archavonAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), boss_zuramat::boss_zuramatAI::UpdateAI(), npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_exarch_maladaar::UpdateAI(), boss_nexusprince_shaffar::UpdateAI(), npc_yor::UpdateAI(), boss_anzu::UpdateAI(), npc_maiev_illidan::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_high_nethermancer_zerevor::UpdateAI(), boss_lady_malande::UpdateAI(), boss_veras_darkshadow::UpdateAI(), boss_essence_of_suffering::boss_essence_of_sufferingAI::UpdateAI(), boss_essence_of_desire::boss_essence_of_desireAI::UpdateAI(), boss_essence_of_anger::boss_essence_of_angerAI::UpdateAI(), boss_doomlord_kazzak::boss_doomlordkazzakAI::UpdateAI(), boss_doomwalker::UpdateAI(), boss_leotheras_the_blind::UpdateAI(), boss_gruul::UpdateAI(), boss_the_maker::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), boss_watchkeeper_gargolmar::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), boss_alar::UpdateAI(), advisor_baseAI::UpdateAI(), npc_maghar_captive::npc_maghar_captiveAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), emerald_dragonAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), PetAI::UpdateAI(), npc_orb_carrier::npc_orb_carrierAI::UpdateAI(), npc_hor_raging_ghoul::npc_hor_raging_ghoulAI::UpdateAI(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::UpdateAI(), npc_wg_spirit_guide::npc_wg_spirit_guideAI::UpdateAI(), Player::UpdateCharmedAI(), npc_general_andorov::UpdateEscortAI(), npc_onyx_flamecaller::npc_onyx_flamecallerAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), npc_kurenai_captive::npc_kurenai_captiveAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), SmartAI::UpdatePath(), and SmartScript::UpdateTimer().

◆ HasUnitTypeMask()

◆ HasVisibleAuraType()

bool Unit::HasVisibleAuraType ( AuraType  auraType) const
5720{
5721 AuraEffectList const& mAuraList = GetAuraEffectsByType(auraType);
5722 for (AuraEffectList::const_iterator i = mAuraList.begin(); i != mAuraList.end(); ++i)
5723 if ((*i)->GetBase()->CanBeSentToClient())
5724 return true;
5725
5726 return false;
5727}

References GetAuraEffectsByType().

◆ HasWaterBreathingAura()

bool Unit::HasWaterBreathingAura ( ) const
inline
@ SPELL_AURA_WATER_BREATHING
Definition: SpellAuraDefines.h:145

References HasAuraType(), and SPELL_AURA_WATER_BREATHING.

Referenced by Player::getMaxTimer().

◆ HasWaterWalkAura()

bool Unit::HasWaterWalkAura ( ) const
inline
@ SPELL_AURA_WATER_WALK
Definition: SpellAuraDefines.h:167

References HasAuraType(), and SPELL_AURA_WATER_WALK.

Referenced by Player::GetAurasForTarget().

◆ HasWeapon()

virtual bool Unit::HasWeapon ( WeaponAttackType  type) const
pure virtual

Implemented in Creature, and Player.

Referenced by HasMainhandWeapon(), HasOffhandWeapon(), and HasRangedWeapon().

◆ HasWeaponForAttack()

virtual bool Unit::HasWeaponForAttack ( WeaponAttackType  type) const
inlinevirtual

Reimplemented in Creature, and Player.

932{ return CanUseAttackType(type); }
bool CanUseAttackType(uint8 attacktype) const
Definition: Unit.h:936

References CanUseAttackType().

Referenced by hasMainhandWeaponForAttack(), HasMainhandWeaponForAttack(), HasOffhandWeaponForAttack(), HasRangedWeaponForAttack(), Creature::HasWeaponForAttack(), and Player::HasWeaponForAttack().

◆ haveOffhandWeapon()

bool Unit::haveOffhandWeapon ( ) const
522{
523 if (Player const* player = ToPlayer())
524 return player->GetWeaponForAttack(OFF_ATTACK, true);
525
526 return CanDualWield();
527}
bool CanDualWield() const
Definition: Unit.h:923

References CanDualWield(), OFF_ATTACK, and Object::ToPlayer().

Referenced by boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), and boss_twin_valkyrAI::myDoMeleeAttackIfReady().

◆ HealBySpell()

int32 Unit::HealBySpell ( HealInfo healInfo,
bool  critical = false 
)
11245{
11246 uint32 heal = healInfo.GetHeal();
11247 sScriptMgr->ModifyHealReceived(this, healInfo.GetTarget(), heal, healInfo.GetSpellInfo());
11248 healInfo.SetHeal(heal);
11249
11250 // calculate heal absorb and reduce healing
11251 CalcHealAbsorb(healInfo);
11252
11253 int32 gain = Unit::DealHeal(healInfo.GetHealer(), healInfo.GetTarget(), healInfo.GetHeal());
11254 healInfo.SetEffectiveHeal(gain);
11255
11256 SendHealSpellLog(healInfo, critical);
11257 return gain;
11258}
Unit * GetHealer() const
Definition: Unit.h:410
void SetHeal(uint32 amount)
Definition: Unit.h:400
void SetEffectiveHeal(uint32 amount)
Definition: Unit.h:405
static void CalcHealAbsorb(HealInfo &healInfo)
Definition: Unit.cpp:2502
static int32 DealHeal(Unit *healer, Unit *victim, uint32 addhealth)
Definition: Unit.cpp:10951
void SendHealSpellLog(HealInfo const &healInfo, bool critical=false)
Definition: Unit.cpp:11227

References CalcHealAbsorb(), DealHeal(), HealInfo::GetHeal(), HealInfo::GetHealer(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), SendHealSpellLog(), HealInfo::SetEffectiveHeal(), HealInfo::SetHeal(), and sScriptMgr.

Referenced by Spell::DoAllEffectOnTarget(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ HealthAbovePct()

◆ HealthAbovePctHealed()

bool Unit::HealthAbovePctHealed ( int32  pct,
uint32  heal 
) const
inline

◆ HealthBelowPct()

bool Unit::HealthBelowPct ( int32  pct) const
inline
1037{ return GetHealth() < CountPctFromMaxHealth(pct); }

References CountPctFromMaxHealth(), and GetHealth().

Referenced by boss_moira_bronzebeardAI::CastOnEmperorIfPossible(), boss_mor_grayhoof::DamageTaken(), boss_isalien::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::DamageTaken(), boss_hadronox::boss_hadronoxAI::DamageTaken(), HandleDummyAuraProc(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), HandleProcTriggerSpell(), ScriptedAI::HealthBelowPct(), boss_kalec::JustEngagedWith(), boss_sathrovarr::JustEngagedWith(), npc_akama_illidan::JustEngagedWith(), npc_maiev_illidan::JustEngagedWith(), boss_olm_the_summoner::JustEngagedWith(), boss_priestess_lackey_commonAI::JustEngagedWith(), boss_yazzai::JustEngagedWith(), boss_grand_warlock_nethekurse::JustEngagedWith(), Player::LoadFromDB(), npc_death_knight_initiate::OnGossipHello(), SetHealth(), SpellPctHealingModsDone(), Update(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), and npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI().

◆ HealthBelowPctDamaged()

bool Unit::HealthBelowPctDamaged ( int32  pct,
uint32  damage 
) const
inline
1038{ return int64(GetHealth()) - int64(damage) < int64(CountPctFromMaxHealth(pct)); }
std::int64_t int64
Definition: Define.h:102

References CountPctFromMaxHealth(), and GetHealth().

Referenced by boss_mandokir::boss_mandokirAI::DamageDealt(), boss_lord_valthalak::boss_lord_valthalakAI::DamageTaken(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::DamageTaken(), boss_quartermaster_zigris::DamageTaken(), boss_warmaster_voone::boss_warmastervooneAI::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_golemagg::boss_golemaggAI::DamageTaken(), npc_core_rager::npc_core_ragerAI::DamageTaken(), boss_attumen::DamageTaken(), boss_midnight::DamageTaken(), boss_kormok::DamageTaken(), npc_batrider::DamageTaken(), npc_coren_direbrew::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_onyxia::DamageTaken(), npc_anubisath_guardian::DamageTaken(), boss_ouro::DamageTaken(), npc_anubisath_sentinel::aqsentinelAI::DamageTaken(), npc_anubisath_defender::DamageTaken(), boss_elder_nadox::DamageTaken(), boss_volazj::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_gunship::npc_gunshipAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_gunship_boarding_addAI::DamageTaken(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::DamageTaken(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::DamageTaken(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), npc_xt002_boombot::npc_xt002_boombotAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_akama_shade::DamageTaken(), boss_vazruden::DamageTaken(), npc_millhouse_manastorm::npc_millhouse_manastormAI::DamageTaken(), npc_magister_aledis::DamageTaken(), BossAI::DamageTaken(), boss_buru::DamageTaken(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), boss_bug_trio::DamageTaken(), boss_hadronox::boss_hadronoxAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), and HandleProcTriggerSpell().

◆ IncrDiminishing()

void Unit::IncrDiminishing ( DiminishingGroup  group)
15034{
15035 // Checking for existing in the table
15036 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15037 {
15038 if (i->DRGroup != group)
15039 continue;
15040 if (int32(i->hitCount) < GetDiminishingReturnsMaxLevel(group))
15041 i->hitCount += 1;
15042 return;
15043 }
15045}
DiminishingLevels GetDiminishingReturnsMaxLevel(DiminishingGroup group)
Definition: SpellMgr.cpp:264
Definition: Unit.h:272

References DIMINISHING_LEVEL_2, GetDiminishingReturnsMaxLevel(), GameTime::GetGameTimeMS(), and m_Diminishing.

Referenced by Spell::DoSpellHitOnUnit().

◆ InitCharmInfo()

CharmInfo * Unit::InitCharmInfo ( )
15813{
15814 if (!m_charmInfo)
15815 m_charmInfo = new CharmInfo(this);
15816
15817 return m_charmInfo;
15818}
Definition: CharmInfo.h:126

References m_charmInfo.

Referenced by Guardian::Guardian(), Pet::Pet(), and SetCharmedBy().

◆ InitStatBuffMods()

void Unit::InitStatBuffMods ( )
inline
1007 {
1008 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + i, 0);
1009 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + i, 0);
1010 }

References STAT_STRENGTH, UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by Player::InitStatsForLevel().

◆ InitTamedPet()

bool Unit::InitTamedPet ( Pet pet,
uint8  level,
uint32  spell_id 
)
17397{
17398 Player* player = ToPlayer();
17399 PetStable& petStable = player->GetOrInitPetStable();
17400 if (petStable.CurrentPet || petStable.GetUnslottedHunterPet())
17401 return false;
17402
17403 pet->SetCreatorGUID(GetGUID());
17404 pet->SetFaction(GetFaction());
17405 pet->SetUInt32Value(UNIT_CREATED_BY_SPELL, spell_id);
17406
17407 if (IsPlayer())
17409
17410 if (!pet->InitStatsForLevel(level))
17411 {
17412 LOG_ERROR("entities.unit", "Pet::InitStatsForLevel() failed for creature (Entry: {})!", pet->GetEntry());
17413 return false;
17414 }
17415
17416 pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
17417 // this enables pet details window (Shift+P)
17418 pet->InitPetCreateSpells();
17419 pet->SetFullHealth();
17420 pet->FillPetInfo(&petStable.CurrentPet.emplace());
17421 return true;
17422}
@ UNIT_CREATED_BY_SPELL
Definition: UpdateFields.h:138
bool InitStatsForLevel(uint8 level)
Definition: Pet.cpp:1015
void FillPetInfo(PetStable::PetInfo *petInfo) const
Definition: Pet.cpp:2468
void InitPetCreateSpells()
Definition: Pet.cpp:2043
Definition: PetDefines.h:202
PetInfo const * GetUnslottedHunterPet() const
Definition: PetDefines.h:230
Optional< PetInfo > CurrentPet
Definition: PetDefines.h:225
PetStable & GetOrInitPetStable()
Definition: Player.cpp:15589
void SetPetNumber(uint32 petnumber, bool statwindow)
Definition: CharmInfo.cpp:240
void SetFullHealth()
Definition: Unit.h:1047
void SetFaction(uint32 faction)
Definition: Unit.cpp:10056
void ReplaceAllUnitFlags(UnitFlags flags)
Remove the Unit flag specify only.
Definition: Unit.h:715
CharmInfo * GetCharmInfo()
Definition: Unit.h:1206
void SetCreatorGUID(ObjectGuid creator)
Definition: Unit.h:681

References PetStable::CurrentPet, Pet::FillPetInfo(), GetCharmInfo(), Object::GetEntry(), GetFaction(), Object::GetGUID(), Player::GetOrInitPetStable(), PetStable::GetUnslottedHunterPet(), Pet::InitPetCreateSpells(), Guardian::InitStatsForLevel(), Object::IsPlayer(), LOG_ERROR, ReplaceAllUnitFlags(), SetCreatorGUID(), SetFaction(), SetFullHealth(), CharmInfo::SetPetNumber(), SetUInt32Value(), sObjectMgr, Object::ToPlayer(), UNIT_CREATED_BY_SPELL, and UNIT_FLAG_PLAYER_CONTROLLED.

Referenced by CreateTamedPetFrom().

◆ InterruptNonMeleeSpells()

void Unit::InterruptNonMeleeSpells ( bool  withDelayed,
uint32  spellid = 0,
bool  withInstant = true,
bool  bySelf = false 
)
4130{
4131 // generic spells are interrupted if they are not finished or delayed
4132 if (m_currentSpells[CURRENT_GENERIC_SPELL] && (!spell_id || m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->Id == spell_id))
4133 InterruptSpell(CURRENT_GENERIC_SPELL, withDelayed, withInstant, bySelf);
4134
4135 // autorepeat spells are interrupted if they are not finished or delayed
4136 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL] && (!spell_id || m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id == spell_id))
4137 InterruptSpell(CURRENT_AUTOREPEAT_SPELL, withDelayed, withInstant, bySelf);
4138
4139 // channeled spells are interrupted if they are not finished, even if they are delayed
4140 if (m_currentSpells[CURRENT_CHANNELED_SPELL] && (!spell_id || m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->Id == spell_id))
4141 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
4142}

References CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, InterruptSpell(), and m_currentSpells.

Referenced by _EnterVehicle(), PetAI::_stopAttack(), Player::ActivateSpec(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), CleanupBeforeRemoveFromMap(), CombatStop(), boss_julianne::DamageTaken(), npc_mograine::npc_mograineAI::DamageTaken(), boss_onyxia::DamageTaken(), boss_volazj::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_warden_mellichar::npc_warden_mellicharAI::DamageTaken(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DamageTaken(), DealDamage(), boss_leotheras_the_blind::DemonTime(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_akilzon::DoAction(), npc_medivh_bm::DoAction(), boss_thorim_sif::boss_thorim_sifAI::DoAction(), boss_nazan::DoAction(), npc_ranshalla::npc_ranshallaAI::DoContinueEscort(), Spell::EffectKnockBack(), boss_leotheras_the_blind::ElfTime(), boss_felblood_kaelthas::GravityLapseSequence(), spell_dk_death_grip::HandleBaseDummy(), WorldSession::HandleCancelCastOpcode(), spell_magtheridon_shadow_grasp::HandleDummyRemove(), spell_novos_crystal_handler_death_aura::HandleEffectApply(), spell_hydross_cleansing_field_command::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLootOpcode(), WorldSession::HandlePetActionHelper(), spell_the_lich_king_jump::HandleScript(), npc_kilrek::JustEngagedWith(), boss_archimonde::JustEngagedWith(), boss_infinite_corruptor::boss_infinite_corruptorAI::JustEngagedWith(), boss_taldaram::JustEngagedWith(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::JustEngagedWith(), boss_urom::boss_uromAI::JustEngagedWith(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::JustEngagedWith(), boss_kelidan_the_breaker::JustEngagedWith(), boss_curator::JustEngagedWith(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustEngagedWith(), boss_gal_darah::boss_gal_darahAI::JustEngagedWith(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustEngagedWith(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustEngagedWith(), violet_hold_trashAI::JustEngagedWith(), PetAI::KilledUnit(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), boss_shade_of_aran::OnPowerUpdate(), boss_jeklik::PathEndReached(), npc_akama_illidan::PathEndReached(), PretendToDie(), boss_alar::PretendToDie(), SmartScript::ProcessAction(), RemoveAurasWithInterruptFlags(), boss_curator::Reset(), boss_malchezaar::Reset(), boss_varos::boss_varosAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), boss_talon_king_ikiss::Reset(), boss_high_astromancer_solarian::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), boss_illidan_stormrage::ScheduleAbilities(), boss_the_lurker_below::SchedulerPhaseOne(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), boss_anomalus::SetData(), setDeathState(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), StopAttackFaction(), Player::TeleportTo(), CasterAI::UpdateAI(), TotemAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and PetAI::UpdateAI().

◆ InterruptSpell()

void Unit::InterruptSpell ( CurrentSpellTypes  spellType,
bool  withDelayed = true,
bool  withInstant = true,
bool  bySelf = false 
)
4061{
4062 //LOG_DEBUG("entities.unit", "Interrupt spell for unit {}.", GetEntry());
4063 Spell* spell = m_currentSpells[spellType];
4064 if (spell
4065 && (withDelayed || spell->getState() != SPELL_STATE_DELAYED)
4066 && (withInstant || spell->GetCastTime() > 0 || spell->getState() == SPELL_STATE_CASTING)) // xinef: or spell is in casting state (channeled spells only)
4067 {
4068 // for example, do not let self-stun aura interrupt itself
4069 if (!spell->IsInterruptable())
4070 return;
4071
4072 // send autorepeat cancel message for autorepeat spells
4073 if (spellType == CURRENT_AUTOREPEAT_SPELL)
4074 if (IsPlayer())
4076
4077 if (spell->getState() != SPELL_STATE_FINISHED)
4078 spell->cancel(bySelf);
4079 else
4080 {
4081 m_currentSpells[spellType] = nullptr;
4082 spell->SetReferencedFromCurrent(false);
4083 }
4084 }
4085}
@ SPELL_STATE_DELAYED
Definition: Spell.h:231
void SendAutoRepeatCancel(Unit *target)
Definition: PlayerMisc.cpp:152
bool IsInterruptable() const
Definition: Spell.h:563
int32 GetCastTime() const
Definition: Spell.h:550
uint32 getState() const
Definition: Spell.h:485
void cancel(bool bySelf=false)
Definition: Spell.cpp:3723

References Spell::cancel(), CURRENT_AUTOREPEAT_SPELL, Spell::GetCastTime(), Spell::getState(), Spell::IsInterruptable(), Object::IsPlayer(), m_currentSpells, Player::SendAutoRepeatCancel(), Spell::SetReferencedFromCurrent(), SPELL_STATE_CASTING, SPELL_STATE_DELAYED, SPELL_STATE_FINISHED, and Object::ToPlayer().

Referenced by _UpdateAutoRepeatSpell(), Player::ActivateTaxiPathTo(), Attack(), AttackStop(), CastStop(), Spell::EffectInterruptCast(), Spell::EffectSanctuary(), AuraEffect::HandleAuraModSilence(), WorldSession::HandleCancelAuraOpcode(), WorldSession::HandleCancelAutoRepeatSpellOpcode(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleCancelChanneling(), spell_hun_scatter_shot::HandleDummy(), AuraEffect::HandleFeignDeath(), InterruptNonMeleeSpells(), SmartAI::JustEngagedWith(), Player::RemoveItemDependentAurasAndCasts(), SetCurrentCastedSpell(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_nightbane::TriggerHealthTakeOff(), and npc_belnistrasz::npc_belnistraszAI::UpdateAI().

◆ InvalidateValuesUpdateCache()

void Unit::InvalidateValuesUpdateCache ( )
inlineprivate
2091{ _valuesUpdateCache.clear(); }

References _valuesUpdateCache.

Referenced by SetUInt32Value(), and Update().

◆ IsAlive()

bool Unit::IsAlive ( ) const
inline
1654{ return (m_deathState == DeathState::Alive); };

References m_deathState.

Referenced by _CreateAuraApplication(), CreatureAI::_EnterEvadeMode(), _EnterVehicle(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::_LoadItem(), BossAI::_Reset(), WorldBossAI::_Reset(), KillRewarder::_RewardHonor(), KillRewarder::_RewardKillCredit(), KillRewarder::_RewardXP(), PetAI::_stopAttack(), AddAura(), Map::AddPlayerToMap(), HostileReference::AddThreat(), Spell::AddUnitTarget(), Attack(), PetAI::AttackedBy(), AttackerStateUpdate(), boss_freya::boss_freyaAI::boss_freyaAI(), boss_hodir::boss_hodirAI::boss_hodirAI(), boss_mimiron::boss_mimironAI::boss_mimironAI(), boss_thorim::boss_thorimAI::boss_thorimAI(), WorldSession::BuildPartyMemberStatsChangedPacket(), Player::BuyItemFromVendorSlot(), CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), instance_ruins_of_ahnqiraj::instance_ruins_of_ahnqiraj_InstanceMapScript::CallNextRajaxxLeader(), Creature::CanAssistTo(), PetAI::CanAttack(), Player::CanCaptureTowerPoint(), CanHaveThreatList(), Player::CanInteractWithQuestGiver(), Player::CanUseAmmo(), Player::CanUseBattlegroundObject(), Player::CanUseItem(), Player::CastItemCombatSpell(), Player::CheckAreaExploreAndOutdoor(), spell_dk_raise_ally::CheckCast(), spell_hun_check_pet_los::CheckCast(), spell_hun_pet_heart_of_the_phoenix::CheckCast(), spell_hun_bestial_wrath::CheckCast(), Spell::CheckCast(), boss_gothik::boss_gothikAI::CheckGroupSplitted(), BattlegroundRV::CheckPositionForUnit(), spell_mage_focus_magic::CheckProc(), spell_dk_blood_caked_blade::CheckProc(), spell_dk_dancing_rune_weapon::CheckProc(), spell_item_necrotic_touch::CheckProc(), spell_pal_seal_of_righteousness::CheckProc(), spell_warl_siphon_life::CheckProc(), spell_putricide_mutation_init::CheckRequirementInternal(), SpellInfo::CheckTarget(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), CreatureUnitRelocationWorker(), DealDamage(), DealDamageMods(), DealMeleeDamage(), DealSpellDamage(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), Creature::DisappearAndDie(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), npc_xerestrasza::npc_xerestraszaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_sister_svalna::boss_sister_svalnaAI::DoAction(), boss_high_king_maulgar::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_infinite_corruptor::boss_infinite_corruptorAI::DoAction(), boss_tharon_ja::boss_tharon_jaAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), Spell::DoAllEffectOnTarget(), spell_hun_masters_call::DoCheckCast(), RandomMovementGenerator< T >::DoInitialize(), WorldSession::DoLootRelease(), WaypointMovementGenerator< Creature >::DoUpdate(), instance_blackrock_spire::instance_blackrock_spireMapScript::Dragonspireroomcheck(), Spell::EffectAddExtraAttacks(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectEnvironmentalDMG(), Spell::EffectFeedPet(), Spell::EffectHeal(), Spell::EffectHealMaxHealth(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), Spell::EffectHealthLeech(), Spell::EffectInstaKill(), Spell::EffectInterruptCast(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectResurrect(), Spell::EffectResurrectNew(), Spell::EffectResurrectPet(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSelfResurrect(), Spell::EffectSkinPlayerCorpse(), Spell::EffectStuck(), Spell::EffectThreat(), Spell::EffectWeaponDmg(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), Player::EnvironmentalDamage(), Player::EquipItem(), BattleExperienceEvent::Execute(), DelayedMovementEvent::Execute(), IceTombSummonEvent::Execute(), SACActivateEvent::Execute(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::ExecuteEvent(), AssistanceMovementGenerator::Finalize(), Creature::ForcedDespawn(), CreatureGroup::FormationReset(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::GetData(), GetDebugInfo(), Player::GetInitialVisiblePackets(), FollowerAI::GetLeaderForFollower(), Player::getMaxTimer(), CreatureGroup::GetNewTargetForMember(), Player::GetNPCIfCanInteractWith(), GetPartyMembers(), npc_air_force_bots::npc_air_force_botsAI::GetSummonedGuard(), npc_wild_wyrm::npc_wild_wyrmAI::GetValidPlayer(), Pet::GivePetXP(), Player::GiveXP(), go_wind_stone::go_wind_stoneAI::GossipSelect(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), BattlegroundEY::HandleAreaTrigger(), BattlegroundWS::HandleAreaTrigger(), WorldSession::HandleAreaTriggerOpcode(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModTotalThreat(), WorldSession::HandleAutostoreLootItemOpcode(), WorldSession::HandleBattleFieldPortOpcode(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), HandleDummyAuraProc(), WorldSession::HandleEmoteOpcode(), Player::HandleFall(), misc_commandscript::HandleFreezeCommand(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleMessagechatOpcode(), AuraEffect::HandleModTaunt(), AuraEffect::HandleModTotalPercentStat(), WorldSession::HandleMovementOpcodes(), npc_commandscript::HandleNpcMoveCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetWanderDistanceCommand(), AuraEffect::HandleObsModPowerAuraTick(), spell_yogg_saron_brain_link_aura::HandleOnEffectApply(), WorldSession::HandleOpenItemOpcode(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandlePetAction(), WorldSession::HandlePetCancelAuraOpcode(), WorldSession::HandlePetStopAttack(), misc_commandscript::HandlePInfoCommand(), spell_pal_seal_of_command_aura::HandleProc(), HandleProcTriggerSpell(), WorldSession::HandleReclaimCorpseOpcode(), WorldSession::HandleRepopRequestOpcode(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), WorldSession::HandleSetAmmoOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), ArenaSpectator::HandleSpectatorWatchCommand(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleSummonResponseOpcode(), WorldSession::HandleUnstablePet(), boss_prince_keleseth_icc::boss_prince_kelesethAI::InitializeAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::InitializeAI(), boss_prince_valanar_icc::boss_prince_valanarAI::InitializeAI(), boss_moroes::InitializeGuests(), Player::IsAtGroupRewardDistance(), Player::IsAtRecruitAFriendDistance(), Creature::IsInvisibleDueToDespawn(), Player::IsOutdoorPvPActive(), Player::IsPetNeedBeTemporaryUnsummoned(), isTargetableForAttack(), IsValidCombatTarget(), Spell::IsValidDeadOrAliveTarget(), ThreatCalcHelper::isValidProcess(), npc_kilrek::JustDied(), boss_rajaxx::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_freya::boss_freyaAI::JustEngagedWith(), npc_underbat::JustEngagedWith(), boss_sartharion::boss_sartharionAI::JustEngagedWith(), boss_fathomlord_karathress::JustReachedHome(), boss_rotface::boss_rotfaceAI::JustSummoned(), Kill(), boss_hadronox::boss_hadronoxAI::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), Player::LoadCorpse(), Player::LoadFromDB(), LoadHelper(), MagicSpellHitResult(), AchievementCriteriaData::Meets(), CreatureGroup::MemberEngagingTarget(), CreatureGroup::MemberEvaded(), npc_twiggy_flathead::npc_twiggy_flatheadAI::MoveInLineOfSight(), boss_lord_marrowgar::MoveInLineOfSight(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::MoveInLineOfSight(), boss_kelthuzad::boss_kelthuzadAI::MoveInLineOfSight(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnCreatureCreate(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_uldaman::instance_uldaman_InstanceMapScript::OnCreatureCreate(), instance_temple_of_ahnqiraj::instance_temple_of_ahnqiraj_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), instance_shadow_labyrinth::instance_shadow_labyrinth_InstanceMapScript::OnCreatureCreate(), go_palehoof_sphere::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), spell_yogg_saron_brain_link_aura::OnPeriodic(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnPlayerEnter(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::OnPlayerEnter(), at_orb_of_command::OnTrigger(), at_ancient_leaf::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_celestial_planetarium_enterance::OnTrigger(), AreaTrigger_at_voltarus_middle::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), AreaTrigger_at_sentry_point::OnTrigger(), SmartTrigger::OnTrigger(), AreaTrigger_at_area_52_entrance::OnTrigger(), at_dragonspire_hall::OnTrigger(), at_blackrock_stadium::OnTrigger(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), at_commander_dawnforge::OnTrigger(), RisenArchmageCheck::operator()(), WretchedGhoulCleaner::operator()(), ValithriaDespawner::operator()(), Acore::NearestCreatureEntryWithLiveStateInObjectRangeCheck::operator()(), Acore::PlayerAtMinimumRangeAway::operator()(), Acore::AnyDeadUnitObjectInRangeCheck::operator()(), Acore::AnyPlayerInObjectRangeCheck::operator()(), Acore::NearestPlayerInObjectRangeCheck::operator()(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPPercentMissingInRange::operator()(), Acore::FriendlyCCedInRange::operator()(), Acore::FriendlyMissingBuffInRange::operator()(), Acore::AnyUnfriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyNotSelfUnitInObjectRangeCheck::operator()(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), Acore::AnyUnitInObjectRangeCheck::operator()(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), Acore::AnyDeadUnitCheck::operator()(), Acore::AllFriendlyCreaturesInGrid::operator()(), Acore::MostHPMissingGroupInRange::operator()(), FrostwingVrykulSearcher::operator()(), Acore::AllDeadCreaturesInRange::operator()(), ShadowTrapLKTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), DefileTargetSelector::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), MapMgr::PlayerCannotEnter(), ProcDamageAndSpell(), RemoveCharmedBy(), Group::RemoveMember(), Player::RemovePet(), Battleground::RemovePlayerAtLeave(), Player::RepopAtGraveyard(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::Reset(), boss_fathomlord_karathress::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), Creature::Respawn(), Player::RewardPlayerAndGroupAtEvent(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), Player::SendLoot(), npc_corrupted_totem::SetAura(), instance_naxxramas::instance_naxxramas_InstanceMapScript::SetBossState(), SetConfused(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::SetData(), npc_enslaved_proto_drake::SetData(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::SetData(), boss_teron_gorefiend::SetData(), Player::setDeathState(), Creature::SetDisableGravity(), SetFeared(), Creature::SetHover(), SetInCombatState(), SetStunned(), Battlefield::ShowNpc(), npc_dark_iron_guzzler::SpellHit(), npc_crusade_persuaded::npc_crusade_persuadedAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), boss_janalai::StartBombing(), WaypointMovementGenerator< Creature >::StartMove(), PassengerController::SummonCreatures(), boss_rend_blackhand::boss_rend_blackhandAI::SummonedCreatureDespawn(), boss_priestess_delrissa::SummonedCreatureDies(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), Player::SwapItem(), lfg::LFGMgr::TeleportPlayer(), BattlegroundRV::TeleportUnitToNewZ(), Pet::Update(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), Creature::Update(), TempSummon::Update(), Puppet::Update(), Player::Update(), Totem::Update(), Update(), TimedFleeingMovementGenerator::Update(), TotemAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_dark_iron_guzzler::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_taldaram::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_bone_spike::npc_bone_spikeAI::UpdateAI(), npc_ice_tomb::npc_ice_tombAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::UpdateAI(), PetAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_ringo::npc_ringoAI::UpdateFollowerAI(), InstanceScript::UpdateMinionState(), Creature::UpdateMovementFlags(), boss_netherspite::UpdatePortals(), boss_twin_valkyrAI::UpdateSharedHealth(), UpdateSplineMovement(), Player::UpdateZone(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsAlwaysDetectableFor()

bool Unit::IsAlwaysDetectableFor ( WorldObject const *  seer) const
overrideprotectedvirtual

Reimplemented from WorldObject.

14215{
14217 return true;
14218
14219 if (HasAuraTypeWithCaster(SPELL_AURA_MOD_STALKED, seer->GetGUID()))
14220 return true;
14221
14222 if (Player* ownerPlayer = GetSpellModOwner())
14223 if (Player const* seerPlayer = seer->ToPlayer())
14224 {
14225 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14226 return true;
14227 }
14228
14229 return false;
14230}
@ SPELL_AURA_MOD_STALKED
Definition: SpellAuraDefines.h:131
virtual bool IsAlwaysDetectableFor(WorldObject const *) const
Definition: Object.h:666

References Object::GetGUID(), GetSpellModOwner(), HasAuraTypeWithCaster(), WorldObject::IsAlwaysDetectableFor(), SPELL_AURA_MOD_STALKED, and Object::ToPlayer().

Referenced by Creature::IsAlwaysDetectableFor(), and Player::IsAlwaysDetectableFor().

◆ IsAlwaysVisibleFor()

bool Unit::IsAlwaysVisibleFor ( WorldObject const *  seer) const
overrideprotectedvirtual

Reimplemented from WorldObject.

14196{
14198 return true;
14199
14200 // Always seen by owner
14201 if (ObjectGuid guid = GetCharmerOrOwnerGUID())
14202 if (seer->GetGUID() == guid)
14203 return true;
14204
14205 if (Player const* seerPlayer = seer->ToPlayer())
14206 if (Unit* owner = GetOwner())
14207 if (Player* ownerPlayer = owner->ToPlayer())
14208 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14209 return true;
14210
14211 return false;
14212}
virtual bool IsAlwaysVisibleFor(WorldObject const *) const
Definition: Object.h:663

References GetCharmerOrOwnerGUID(), Object::GetGUID(), GetOwner(), WorldObject::IsAlwaysVisibleFor(), and Object::ToPlayer().

◆ IsArmorer()

bool Unit::IsArmorer ( ) const
inline
@ UNIT_NPC_FLAG_REPAIR
Definition: UnitDefines.h:306
bool HasNpcFlag(NPCFlags flags) const
Definition: Unit.h:725

References HasNpcFlag(), and UNIT_NPC_FLAG_REPAIR.

◆ isAttackingPlayer()

bool Unit::isAttackingPlayer ( ) const
10463{
10465 return true;
10466
10467 if (!m_Controlled.empty())
10468 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10469 if ((*itr)->isAttackingPlayer())
10470 return true;
10471
10472 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
10473 if (m_SummonSlot[i])
10474 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
10475 if (summon->isAttackingPlayer())
10476 return true;
10477
10478 return false;
10479}

References WorldObject::GetMap(), HasUnitState(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, and UNIT_STATE_ATTACK_PLAYER.

◆ isAttackReady()

◆ IsAttackSpeedOverridenShapeShift()

bool Unit::IsAttackSpeedOverridenShapeShift ( ) const
19516{
19517 // Mirroring clientside gameplay logic
19518 if (ShapeshiftForm form = GetShapeshiftForm())
19519 if (SpellShapeshiftFormEntry const* entry = sSpellShapeshiftFormStore.LookupEntry(form))
19520 return entry->attackSpeed > 0;
19521
19522 return false;
19523}

References GetShapeshiftForm(), and sSpellShapeshiftFormStore.

Referenced by Player::CalculateMinMaxDamage().

◆ IsAuctioner()

bool Unit::IsAuctioner ( ) const
inline
@ UNIT_NPC_FLAG_AUCTIONEER
Definition: UnitDefines.h:315

References HasNpcFlag(), and UNIT_NPC_FLAG_AUCTIONEER.

◆ IsBanker()

bool Unit::IsBanker ( ) const
inline
@ UNIT_NPC_FLAG_BANKER
Definition: UnitDefines.h:311

References HasNpcFlag(), and UNIT_NPC_FLAG_BANKER.

◆ IsBattleMaster()

bool Unit::IsBattleMaster ( ) const
inline

◆ isBeingLoaded()

virtual bool Unit::isBeingLoaded ( ) const
inlinevirtual

Reimplemented in Pet, and Player.

667{ return false;}

Referenced by Player::SetMover().

◆ isBlockCritical()

bool Unit::isBlockCritical ( )
3127{
3129 return true;
3130 return false;
3131}
@ SPELL_AURA_MOD_BLOCK_CRIT_CHANCE
Definition: SpellAuraDefines.h:316

References GetTotalAuraModifier(), roll_chance_i(), and SPELL_AURA_MOD_BLOCK_CRIT_CHANCE.

Referenced by CalculateMeleeDamage(), and CalculateSpellDamageTaken().

◆ IsCharmed()

◆ IsCharmedOwnedByPlayerOrPlayer()

bool Unit::IsCharmedOwnedByPlayerOrPlayer ( ) const
inline
ObjectGuid GetCharmerOrOwnerOrOwnGUID() const
Definition: Unit.h:1221

References GetCharmerOrOwnerOrOwnGUID(), and ObjectGuid::IsPlayer().

Referenced by Spell::DoSpellHitOnUnit(), and ProcDamageAndSpellFor().

◆ IsClass()

◆ IsContestedGuard()

bool Unit::IsContestedGuard ( ) const
inline
974 {
976 return entry->IsContestedGuardFaction();
977
978 return false;
979 }

References GetFactionTemplateEntry().

Referenced by Acore::NearestVisibleDetectableContestedGuardUnitCheck::operator()().

◆ IsControllableGuardian()

bool Unit::IsControllableGuardian ( ) const
inline

◆ IsControlledByPlayer()

◆ IsCreatedByPlayer()

bool Unit::IsCreatedByPlayer ( ) const
inline
1233{ return m_CreatedByPlayer; }

References m_CreatedByPlayer.

Referenced by DealDamage().

◆ IsCritter()

◆ IsDamageReducedByArmor()

bool Unit::IsDamageReducedByArmor ( SpellSchoolMask  damageSchoolMask,
SpellInfo const *  spellInfo = nullptr,
uint8  effIndex = MAX_SPELL_EFFECTS 
)
static
2009{
2010 // only physical spells damage gets reduced by armor
2011 if ((schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0)
2012 return false;
2013 if (spellInfo)
2014 {
2015 // there are spells with no specific attribute but they have "ignores armor" in tooltip
2016 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_IGNORE_ARMOR))
2017 return false;
2018
2019 // bleeding effects are not reduced by armor
2020 if (effIndex != MAX_SPELL_EFFECTS)
2021 {
2022 if (spellInfo->Effects[effIndex].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE ||
2023 spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
2024 if (spellInfo->GetEffectMechanicMask(effIndex) & (1 << MECHANIC_BLEED))
2025 return false;
2026 }
2027 }
2028 return true;
2029}
@ MECHANIC_BLEED
Definition: SharedDefines.h:1340
@ SPELL_ATTR0_CU_IGNORE_ARMOR
Definition: SpellInfo.h:191

References SpellInfo::Effects, SpellInfo::GetEffectMechanicMask(), SpellInfo::HasAttribute(), MAX_SPELL_EFFECTS, MECHANIC_BLEED, SPELL_ATTR0_CU_IGNORE_ARMOR, SPELL_AURA_PERIODIC_DAMAGE, SPELL_EFFECT_SCHOOL_DAMAGE, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ isDead()

bool Unit::isDead ( ) const
inline
1656{ return (m_deathState == DeathState::Dead || m_deathState == DeathState::Corpse); };

References m_deathState.

Referenced by npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), Spell::EffectSummonPet(), Player::GiveLevel(), AuraEffect::HandleAuraDummy(), Player::HandleFall(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), misc_commandscript::HandleRespawnCommand(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), Creature::HasSpellFocus(), UnitAI::InitializeAI(), SmartAI::InitializeAI(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_spinestalker::npc_spinestalkerAI::InitializeAI(), npc_rimefang::npc_rimefangAI::InitializeAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::InitializeAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), Player::isAllowedToLoot(), npc_anubisath_sentinel::aqsentinelAI::JustDied(), Player::OnGossipSelect(), AreaTrigger_at_stormwright_shelf::OnTrigger(), AreaTrigger_at_scent_larkorwi::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), Player::PrepareGossipMenu(), SmartScript::ProcessAction(), Player::RepopAtGraveyard(), npc_anubisath_sentinel::aqsentinelAI::Reset(), WorldSession::SendAttackStop(), SendMeleeAttackStop(), instance_molten_core::instance_molten_core_InstanceMapScript::SetBossState(), and npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI().

◆ IsDuringRemoveFromWorld()

◆ isDying()

bool Unit::isDying ( ) const
inline
1655{ return (m_deathState == DeathState::JustDied); };

References m_deathState.

Referenced by Creature::IsInvisibleDueToDespawn(), and SetHover().

◆ IsEngaged()

◆ IsEngagedBy()

bool Unit::IsEngagedBy ( Unit const *  who) const
inline

◆ IsFalling()

bool Unit::IsFalling ( ) const

◆ IsFFAPvP()

bool Unit::IsFFAPvP ( ) const
inline

◆ IsFlying()

◆ IsFriendlyTo()

bool Unit::IsFriendlyTo ( Unit const *  unit) const
10242{
10243 return GetReactionTo(unit) >= REP_FRIENDLY;
10244}

References GetReactionTo(), and REP_FRIENDLY.

Referenced by Spell::_cast(), AuraApplication::_InitFlags(), Creature::_IsTargetAcceptable(), FollowerAI::AssistPlayerInCombatAgainst(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::AttackedBy(), Creature::CanAssistTo(), spell_dk_death_coil::CheckCast(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), Spell::CheckCast(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), Spell::EffectDispel(), Spell::EffectDispelMechanic(), Spell::EffectStealBeneficialBuff(), Spell::EffectThreat(), Aura::HandleAuraSpecificMods(), spell_dk_death_coil::HandleDummy(), spell_pal_holy_shock::HandleDummy(), spell_pri_penance::HandleDummy(), HandleDummyAuraProc(), BattlefieldWG::HandleKill(), spell_winter_veil_shoot_air_rifle::HandleScriptEffect(), WorldSession::HandleSetSelectionOpcode(), Spell::HandleThreatSpells(), GameObject::IsAlwaysVisibleFor(), SpellClickInfo::IsFitToRequirements(), npc_draenei_survivor::npc_draenei_survivorAI::MoveInLineOfSight(), Acore::AnyUnfriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyNotSelfUnitInObjectRangeCheck::operator()(), Acore::AllFriendlyCreaturesInGrid::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), PetSpellFail(), SmartScript::ProcessEvent(), RemoveCharmedBy(), Spell::SelectExplicitTargets(), Player::SendLoot(), Acore::MessageDistDelivererToHostile::SendPacket(), and TotemAI::UpdateAI().

◆ isFrozen()

◆ IsFullHealth()

◆ IsGossip()

bool Unit::IsGossip ( ) const
inline
@ UNIT_NPC_FLAG_GOSSIP
Definition: UnitDefines.h:294

References HasNpcFlag(), and UNIT_NPC_FLAG_GOSSIP.

◆ IsGuardian()

◆ IsGuildMaster()

bool Unit::IsGuildMaster ( ) const
inline
@ UNIT_NPC_FLAG_PETITIONER
Definition: UnitDefines.h:312

References HasNpcFlag(), and UNIT_NPC_FLAG_PETITIONER.

◆ IsHostileTo()

◆ IsHostileToPlayers()

bool Unit::IsHostileToPlayers ( ) const
10247{
10248 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10249 if (!my_faction || !my_faction->faction)
10250 return false;
10251
10252 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10253 if (raw_faction && raw_faction->reputationListID >= 0)
10254 return false;
10255
10256 return my_faction->IsHostileToPlayers();
10257}
int32 reputationListID
Definition: DBCStructure.h:908
uint32 faction
Definition: DBCStructure.h:940
bool IsHostileToPlayers() const
Definition: DBCStructure.h:980

References FactionTemplateEntry::faction, GetFactionTemplateEntry(), FactionTemplateEntry::IsHostileToPlayers(), FactionEntry::reputationListID, and sFactionStore.

◆ IsHovering()

◆ IsHunterPet()

◆ IsImmunedToDamage() [1/3]

bool Unit::IsImmunedToDamage ( Spell const *  spell) const
12796{
12797 SpellInfo const* spellInfo = spell->GetSpellInfo();
12798 if (!spellInfo)
12799 {
12800 return false;
12801 }
12802
12804 {
12805 return false;
12806 }
12807
12809 {
12810 return false;
12811 }
12812
12813 uint32 schoolMask = spell->GetSpellSchoolMask();
12814 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12815 {
12816 return false;
12817 }
12818
12819 // If m_immuneToDamage type contain magic, IMMUNE damage.
12820 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12821 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12822 {
12823 if ((itr->type & schoolMask) == schoolMask)
12824 {
12825 return true;
12826 }
12827 }
12828
12829 return false;
12830}
@ SPELL_ATTR2_NO_SCHOOL_IMMUNITIES
Definition: SharedDefines.h:482
@ SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS
Definition: SharedDefines.h:435
@ IMMUNITY_DAMAGE
Definition: SharedDefines.h:1397
@ SPELL_SCHOOL_MASK_NONE
Definition: SharedDefines.h:296
std::vector< SpellImmune > SpellImmuneList
Definition: SpellDefines.h:182

References Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_DAMAGE, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, and SPELL_SCHOOL_MASK_NONE.

◆ IsImmunedToDamage() [2/3]

bool Unit::IsImmunedToDamage ( SpellInfo const *  spellInfo) const
12764{
12765 if (!spellInfo)
12766 {
12767 return false;
12768 }
12769
12770 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
12771 {
12772 return false;
12773 }
12774
12775 if (spellInfo->HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS) || spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
12776 {
12777 return false;
12778 }
12779
12780 uint32 schoolMask = spellInfo->GetSchoolMask();
12781 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12782 {
12783 return false;
12784 }
12785
12786 // If m_immuneToDamage type contain magic, IMMUNE damage.
12787 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12788 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12789 if ((itr->type & schoolMask) == schoolMask)
12790 return true;
12791
12792 return false;
12793}

References SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_DAMAGE, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, and SPELL_SCHOOL_MASK_NONE.

◆ IsImmunedToDamage() [3/3]

bool Unit::IsImmunedToDamage ( SpellSchoolMask  meleeSchoolMask) const
12748{
12749 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
12750 {
12751 return false;
12752 }
12753
12754 // If m_immuneToDamage type contain magic, IMMUNE damage.
12755 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12756 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12757 if ((itr->type & meleeSchoolMask) == meleeSchoolMask)
12758 return true;
12759
12760 return false;
12761}

References IMMUNITY_DAMAGE, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

Referenced by boss_gurtogg_bloodboil::CanAIAttack(), Spell::DoSpellHitOnUnit(), and IsImmunedToDamageOrSchool().

◆ IsImmunedToDamageOrSchool() [1/2]

bool Unit::IsImmunedToDamageOrSchool ( SpellInfo const *  spellInfo) const
12912{
12913 return IsImmunedToDamage(spellInfo) || IsImmunedToSchool(spellInfo);
12914}
bool IsImmunedToSchool(SpellSchoolMask meleeSchoolMask) const
Definition: Unit.cpp:12832
bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask) const
Definition: Unit.cpp:12747

References IsImmunedToDamage(), and IsImmunedToSchool().

◆ IsImmunedToDamageOrSchool() [2/2]

◆ IsImmunedToSchool() [1/3]

bool Unit::IsImmunedToSchool ( Spell const *  spell) const
12872{
12873 SpellInfo const* spellInfo = spell->GetSpellInfo();
12875 {
12876 return false;
12877 }
12878
12879 uint32 schoolMask = spell->GetSpellSchoolMask();
12880 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12881 {
12882 return false;
12883 }
12884
12885 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12886 {
12887 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12888 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12889 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12890 {
12891 if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
12892 {
12893 return true;
12894 }
12895 }
12896 }
12897
12898 return false;
12899}
@ IMMUNITY_SCHOOL
Definition: SharedDefines.h:1396
bool CanPierceImmuneAura(SpellInfo const *aura) const
Definition: SpellInfo.cpp:1323

References SpellInfo::CanPierceImmuneAura(), Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_SCHOOL, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

◆ IsImmunedToSchool() [2/3]

bool Unit::IsImmunedToSchool ( SpellInfo const *  spellInfo) const
12849{
12850 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
12851 return false;
12852
12853 uint32 schoolMask = spellInfo->GetSchoolMask();
12854 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12855 {
12856 return false;
12857 }
12858
12859 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12860 {
12861 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12862 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12863 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12864 if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
12865 return true;
12866 }
12867
12868 return false;
12869}

References SpellInfo::CanPierceImmuneAura(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_SCHOOL, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

◆ IsImmunedToSchool() [3/3]

bool Unit::IsImmunedToSchool ( SpellSchoolMask  meleeSchoolMask) const
12833{
12834 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
12835 {
12836 return false;
12837 }
12838
12839 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12840 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12841 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12842 if ((itr->type & meleeSchoolMask) == meleeSchoolMask)
12843 return true;
12844
12845 return false;
12846}

References IMMUNITY_SCHOOL, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

Referenced by Spell::DoSpellHitOnUnit(), IsImmunedToDamageOrSchool(), and SpellHitResult().

◆ IsImmunedToSpell()

bool Unit::IsImmunedToSpell ( SpellInfo const *  spellInfo,
Spell const *  spell = nullptr 
)
virtual

Reimplemented in Creature.

12917{
12918 if (!spellInfo)
12919 return false;
12920
12921 // Single spell immunity.
12922 SpellImmuneList const& idList = m_spellImmune[IMMUNITY_ID];
12923 for (SpellImmuneList::const_iterator itr = idList.begin(); itr != idList.end(); ++itr)
12924 if (itr->type == spellInfo->Id)
12925 return true;
12926
12927 // xinef: my special immunity, if spellid is not on this list it means npc is immune
12928 SpellImmuneList const& allowIdList = m_spellImmune[IMMUNITY_ALLOW_ID];
12929 if (!allowIdList.empty())
12930 {
12931 for (SpellImmuneList::const_iterator itr = allowIdList.begin(); itr != allowIdList.end(); ++itr)
12932 if (itr->type == spellInfo->Id)
12933 return false;
12934 return true;
12935 }
12936
12937 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
12938 return false;
12939
12940 if (spellInfo->Dispel)
12941 {
12942 SpellImmuneList const& dispelList = m_spellImmune[IMMUNITY_DISPEL];
12943 for (SpellImmuneList::const_iterator itr = dispelList.begin(); itr != dispelList.end(); ++itr)
12944 if (itr->type == spellInfo->Dispel)
12945 return true;
12946 }
12947
12948 // Spells that don't have effectMechanics.
12949 if (spellInfo->Mechanic)
12950 {
12951 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
12952 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
12953 if (itr->type == spellInfo->Mechanic)
12954 return true;
12955 }
12956
12957 bool immuneToAllEffects = true;
12958 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12959 {
12960 // State/effect immunities applied by aura expect full spell immunity
12961 // Ignore effects with mechanic, they are supposed to be checked separately
12962 if (!spellInfo->Effects[i].IsEffect())
12963 continue;
12964
12965 // Xinef: if target is immune to one effect, and the spell has transform aura - it is immune to whole spell
12966 if (IsImmunedToSpellEffect(spellInfo, i))
12967 {
12968 if (spellInfo->HasAura(SPELL_AURA_TRANSFORM))
12969 return true;
12970 continue;
12971 }
12972
12973 immuneToAllEffects = false;
12974 break;
12975 }
12976 if (immuneToAllEffects) //Return immune only if the target is immune to all spell effects.
12977 return true;
12978
12979 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12980 {
12981 SpellSchoolMask spellSchoolMask = spellInfo->GetSchoolMask();
12982 if (spell)
12983 {
12984 spellSchoolMask = spell->GetSpellSchoolMask();
12985 }
12986
12987 if (spellSchoolMask != SPELL_SCHOOL_MASK_NONE)
12988 {
12989 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12990 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12991 {
12992 SpellInfo const* immuneSpellInfo = sSpellMgr->GetSpellInfo(itr->spellId);
12993 if (((itr->type & spellSchoolMask) == spellSchoolMask)
12994 && (!immuneSpellInfo || immuneSpellInfo->IsPositive()) && !spellInfo->IsPositive()
12995 && !spellInfo->CanPierceImmuneAura(immuneSpellInfo))
12996 {
12997 return true;
12998 }
12999 }
13000 }
13001 }
13002
13003 return false;
13004}
@ IMMUNITY_ALLOW_ID
Definition: SharedDefines.h:1401
@ IMMUNITY_ID
Definition: SharedDefines.h:1400
@ IMMUNITY_MECHANIC
Definition: SharedDefines.h:1399

References SpellInfo::CanPierceImmuneAura(), SpellInfo::Dispel, SpellInfo::Effects, SpellInfo::GetSchoolMask(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_ALLOW_ID, IMMUNITY_DISPEL, IMMUNITY_ID, IMMUNITY_MECHANIC, IMMUNITY_SCHOOL, IsImmunedToSpellEffect(), SpellInfo::IsPositive(), m_spellImmune, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_TRANSFORM, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

Referenced by AddAura(), Spell::DoSpellHitOnUnit(), Creature::IsImmunedToSpell(), spell_hun_lock_and_load::IsTargetValid(), boss_talon_king_ikiss::JustEngagedWith(), boss_kiggler_the_crazed::JustEngagedWith(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), and SpellHitResult().

◆ IsImmunedToSpellEffect()

bool Unit::IsImmunedToSpellEffect ( SpellInfo const *  spellInfo,
uint32  index 
) const
virtual

Reimplemented in Creature, and Totem.

13007{
13008 if (!spellInfo || !spellInfo->Effects[index].IsEffect())
13009 return false;
13010
13011 // xinef: pet scaling auras
13012 if (spellInfo->HasAttribute(SPELL_ATTR4_OWNER_POWER_SCALING))
13013 return false;
13014
13015 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
13016 return false;
13017
13018 //If m_immuneToEffect type contain this effect type, IMMUNE effect.
13019 uint32 effect = spellInfo->Effects[index].Effect;
13020 SpellImmuneList const& effectList = m_spellImmune[IMMUNITY_EFFECT];
13021 for (SpellImmuneList::const_iterator itr = effectList.begin(); itr != effectList.end(); ++itr)
13022 {
13023 if (itr->type == effect && (itr->spellId != 62692 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
13024 {
13025 return true;
13026 }
13027 }
13028
13029 if (uint32 mechanic = spellInfo->Effects[index].Mechanic)
13030 {
13031 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
13032 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
13033 if (itr->type == mechanic)
13034 return true;
13035 }
13036
13037 if (uint32 aura = spellInfo->Effects[index].ApplyAuraName)
13038 {
13040 for (SpellImmuneList::const_iterator itr = list.begin(); itr != list.end(); ++itr)
13041 {
13042 if (itr->type == aura && (itr->spellId != 64848 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
13043 {
13044 if (!spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
13045 {
13046 if (itr->blockType == SPELL_BLOCK_TYPE_ALL || spellInfo->IsPositive()) // xinef: added for pet scaling
13047 {
13048 return true;
13049 }
13050 }
13051 }
13052 }
13053
13054 if (!spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
13055 {
13056 // Check for immune to application of harmful magical effects
13058 for (AuraEffectList::const_iterator iter = immuneAuraApply.begin(); iter != immuneAuraApply.end(); ++iter)
13059 {
13060 if (/*(spellInfo->Dispel == DISPEL_MAGIC || spellInfo->Dispel == DISPEL_CURSE || spellInfo->Dispel == DISPEL_DISEASE) &&*/ // Magic debuff, xinef: all kinds?
13061 ((*iter)->GetMiscValue() & spellInfo->GetSchoolMask()) && // Check school
13062 !spellInfo->IsPositiveEffect(index) && // Harmful
13063 spellInfo->Effects[index].Effect != SPELL_EFFECT_PERSISTENT_AREA_AURA) // Not Persistent area auras
13064 {
13065 return true;
13066 }
13067 }
13068 }
13069 }
13070
13071 return false;
13072}
@ SPELL_EFFECT_PERSISTENT_AREA_AURA
Definition: SharedDefines.h:805
@ SPELL_ATTR3_ALWAYS_HIT
Definition: SharedDefines.h:511
@ IMMUNITY_STATE
Definition: SharedDefines.h:1395
@ IMMUNITY_EFFECT
Definition: SharedDefines.h:1394
@ SPELL_ATTR4_OWNER_POWER_SCALING
Definition: SharedDefines.h:555
@ SPELL_BLOCK_TYPE_ALL
Definition: SpellDefines.h:159
@ SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL
Definition: SpellAuraDefines.h:330
bool CanRestoreMana(SpellInfo const *spellInfo) const
Definition: Unit.cpp:21233

References CanRestoreMana(), SpellInfo::Effects, GetAuraEffectsByType(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_EFFECT, IMMUNITY_MECHANIC, IMMUNITY_STATE, SpellInfo::IsPositive(), SpellInfo::IsPositiveEffect(), m_spellImmune, POWER_MANA, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR4_OWNER_POWER_SCALING, SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL, SPELL_BLOCK_TYPE_ALL, and SPELL_EFFECT_PERSISTENT_AREA_AURA.

Referenced by AddAura(), Spell::AddUnitTarget(), Spell::DoSpellHitOnUnit(), spell_dk_death_grip::HandleBaseDummy(), IsImmunedToSpell(), and Creature::IsImmunedToSpellEffect().

◆ IsImmuneToAll()

bool Unit::IsImmuneToAll ( ) const
inline
875{ return IsImmuneToPC() && IsImmuneToNPC(); }

References IsImmuneToNPC(), and IsImmuneToPC().

◆ IsImmuneToNPC()

◆ IsImmuneToPC()

◆ isInAccessiblePlaceFor()

bool Unit::isInAccessiblePlaceFor ( Creature const *  c) const
4194{
4195 if (c->GetMapId() == 618) // Ring of Valor
4196 {
4197 // skip transport check, check for being below floor level
4198 if (this->GetPositionZ() < 28.0f)
4199 return false;
4200 if (BattlegroundMap* bgMap = c->GetMap()->ToBattlegroundMap())
4201 if (Battleground* bg = bgMap->GetBG())
4202 if (bg->GetStartTime() < 80133) // 60000ms preparation time + 20133ms elevator rise time
4203 return false;
4204 }
4205 else if (c->GetMapId() == 631) // Icecrown Citadel
4206 {
4207 // if static transport doesn't match - return false
4208 if (c->GetTransport() != this->GetTransport() && ((c->GetTransport() && c->GetTransport()->IsStaticTransport()) || (this->GetTransport() && this->GetTransport()->IsStaticTransport())))
4209 return false;
4210
4211 // special handling for ICC (map 631), for non-flying pets in Gunship Battle, for trash npcs this is done via CanAIAttack
4212 if (c->GetOwnerGUID().IsPlayer() && !c->CanFly())
4213 {
4214 if (c->GetTransport() != this->GetTransport())
4215 return false;
4216 if (this->GetTransport())
4217 {
4218 if (c->GetPositionY() < 2033.0f)
4219 {
4220 if (this->GetPositionY() > 2033.0f)
4221 return false;
4222 }
4223 else if (c->GetPositionY() < 2438.0f)
4224 {
4225 if (this->GetPositionY() < 2033.0f || this->GetPositionY() > 2438.0f)
4226 return false;
4227 }
4228 else if (this->GetPositionY() < 2438.0f)
4229 return false;
4230 }
4231 }
4232 }
4233 else
4234 {
4235 // pussywizard: prevent any bugs by passengers exiting transports or normal creatures flying away
4236 if (c->GetTransport() != this->GetTransport())
4237 return false;
4238 }
4239
4240 LiquidStatus liquidStatus = GetLiquidData().Status;
4241 bool isInWater = (liquidStatus & MAP_LIQUID_STATUS_IN_CONTACT) != 0;
4242
4243 // In water or jumping in water
4244 if (isInWater || (liquidStatus == LIQUID_MAP_ABOVE_WATER && (IsFalling() || (ToPlayer() && ToPlayer()->IsFalling()))))
4245 {
4246 return c->CanEnterWater();
4247 }
4248 else
4249 {
4250 return c->CanWalk() || c->CanFly();
4251 }
4252}
LiquidStatus
Definition: Map.h:141
@ LIQUID_MAP_ABOVE_WATER
Definition: Map.h:143
#define MAP_LIQUID_STATUS_IN_CONTACT
Definition: Map.h:150
LiquidData const & GetLiquidData() const
Definition: Object.cpp:3179
bool IsFalling() const
Definition: Unit.cpp:19953
LiquidStatus Status
Definition: Map.h:176
BattlegroundMap * ToBattlegroundMap()
Definition: Map.h:547
Definition: Map.h:851

References Creature::CanEnterWater(), Creature::CanFly(), Creature::CanWalk(), WorldObject::GetLiquidData(), WorldObject::GetMap(), WorldLocation::GetMapId(), GetOwnerGUID(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransport(), IsFalling(), ObjectGuid::IsPlayer(), GameObject::IsStaticTransport(), LIQUID_MAP_ABOVE_WATER, MAP_LIQUID_STATUS_IN_CONTACT, LiquidData::Status, Map::ToBattlegroundMap(), and Object::ToPlayer().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), ChaseMovementGenerator< T >::DoUpdate(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), and HostileReference::updateOnlineStatus().

◆ isInBackInMap()

bool Unit::isInBackInMap ( Unit const *  target,
float  distance,
float  arc = M_PI 
) const

◆ IsInCombat()

bool Unit::IsInCombat ( ) const
inline

References HasUnitFlag(), and UNIT_FLAG_IN_COMBAT.

Referenced by _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), npc_anubisath_sentinel::aqsentinelAI::CallBuddiesToAttack(), npc_argent_captainAI::CanAIAttack(), Player::CanEquipItem(), Creature::CanPeriodicallyCallForAssistance(), Player::CanUnequipItem(), boss_high_nethermancer_zerevor::CastDampenMagicIfPossible(), spell_hun_disengage::CheckCast(), Spell::CheckCast(), SpellInfo::CheckTarget(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), CombatStart(), npc_centrifuge_construct::npc_centrifuge_constructAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DoAction(), boss_the_lich_king::boss_the_lich_kingAI::DoAction(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::DoAction(), npc_risen_archmage::npc_risen_archmageAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), Spell::DoAllEffectOnTarget(), UnitAI::DoCastToAllHostilePlayers(), Spell::DoSpellHitOnUnit(), Spell::EffectActivateRune(), npc_clintar_spirit::npc_clintar_spiritAI::EnterEvadeMode(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), Player::EquipItem(), CastRunesEvent::Execute(), GetVelocity(), spell_apothecary_lingering_fumes::HandleAfterCast(), WorldSession::HandleBattlefieldLeaveOpcode(), WorldSession::HandleBattleFieldPortOpcode(), spell_mc_play_dead_aura::HandleEffectRemove(), WorldSession::HandleEquipmentSetUse(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), spell_putricide_mutated_transformation::HandleSummon(), WorldSession::HandleSummonResponseOpcode(), tele_commandscript::HandleTeleCommand(), misc_commandscript::HandleUnstuckCommand(), WorldSession::HandleUseItemOpcode(), npc_pet_mage_mirror_image::InitializeAI(), IsEngaged(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_anubrekhan::boss_anubrekhanAI::JustSummoned(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), boss_rotface::boss_rotfaceAI::JustSummoned(), boss_nexusprince_shaffar::JustSummoned(), npc_nelson::npc_nelsonAI::JustSummoned(), Pet::LoseHappiness(), CreatureGroup::MemberEvaded(), CreatureAI::MoveInLineOfSight(), boss_eye_of_cthun::MoveInLineOfSight(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::MoveInLineOfSight(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_kelthuzad::boss_kelthuzadAI::MoveInLineOfSight(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_alar::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), npc_death_knight_initiate::OnGossipHello(), npc_ulduar_expedition_commander::OnGossipHello(), go_ulduar_working_harpoon::OnGossipHello(), npc_death_knight_initiate::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), icecrown_citadel_teleport::OnGossipSelect(), at_frozen_throne_teleport::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_voltarus_middle::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), RisenArchmageCheck::operator()(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPPercentMissingInRange::operator()(), Acore::FriendlyCCedInRange::operator()(), Acore::FriendlyMissingBuffInRange::operator()(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::OwnerAttackedBy(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), SmartScript::ProcessEvent(), Creature::Regenerate(), Player::Regenerate(), Player::RegenerateAll(), Player::RegenerateHealth(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), instance_naxxramas::instance_naxxramas_InstanceMapScript::SetBossState(), boss_grand_warlock_nethekurse::SetData(), SetInCombatState(), SetSpeed(), boss_prince_keleseth_icc::boss_prince_kelesethAI::SpellHit(), boss_prince_taldaram_icc::boss_prince_taldaramAI::SpellHit(), boss_prince_valanar_icc::boss_prince_valanarAI::SpellHit(), boss_the_lich_king::boss_the_lich_kingAI::SpellHit(), Spell::SummonGuardian(), lfg::LFGMgr::TeleportPlayer(), Map::Update(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), Creature::Update(), TempSummon::Update(), Update(), DistractMovementGenerator::Update(), TotemAI::UpdateAI(), SimpleCharmedAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_thekal::UpdateAI(), npc_zealot_lorkhan::UpdateAI(), npc_zealot_zath::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), boss_faction_championsAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_frost_freeze_trap::npc_frost_freeze_trapAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), boss_faerlina::boss_faerlinaAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_llod_generic::npc_llod_genericAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_earth_elemental::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), PassiveAI::UpdateAI(), PetAI::UpdateAI(), Player::UpdateContestedPvP(), Creature::UpdateEntry(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), InstanceScript::UpdateMinionState(), SmartAI::UpdatePath(), Player::UpdatePotionCooldown(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsInCombatWith()

bool Unit::IsInCombatWith ( Unit const *  who) const
21040{
21041 // Check target exists
21042 if (!who)
21043 return false;
21044 // Search in threat list
21045 ObjectGuid guid = who->GetGUID();
21046 for (ThreatContainer::StorageType::const_iterator i = m_ThreatMgr.GetThreatList().begin(); i != m_ThreatMgr.GetThreatList().end(); ++i)
21047 {
21048 HostileReference* ref = (*i);
21049 // Return true if the unit matches
21050 if (ref && ref->getUnitGuid() == guid)
21051 return true;
21052 }
21053 // Nothing found, false.
21054 return false;
21055}
Definition: ThreatMgr.h:48
ObjectGuid getUnitGuid() const
Definition: ThreatMgr.h:106
ThreatContainer::StorageType const & GetThreatList() const
Definition: ThreatMgr.h:273

References Object::GetGUID(), ThreatMgr::GetThreatList(), HostileReference::getUnitGuid(), and m_ThreatMgr.

Referenced by _IsValidAttackTarget(), DealDamage(), Spell::DoAllEffectOnTarget(), TemporaryThreatModifierEvent::Execute(), spell_herald_volzaj_insanity::HandleDummyEffect(), IsEngagedBy(), and Acore::NearestAttackableUnitInObjectRangeCheck::operator()().

◆ IsInDisallowedMountForm()

bool Unit::IsInDisallowedMountForm ( ) const
21263{
21264 if (SpellInfo const* transformSpellInfo = sSpellMgr->GetSpellInfo(getTransForm()))
21265 {
21266 if (transformSpellInfo->HasAttribute(SPELL_ATTR0_ALLOW_WHILE_MOUNTED))
21267 {
21268 return false;
21269 }
21270 }
21271
21272 if (ShapeshiftForm form = GetShapeshiftForm())
21273 {
21274 SpellShapeshiftFormEntry const* shapeshift = sSpellShapeshiftFormStore.LookupEntry(form);
21275 if (!shapeshift)
21276 {
21277 return true;
21278 }
21279
21280 if (!(shapeshift->flags1 & 0x1))
21281 {
21282 return true;
21283 }
21284 }
21285
21287 {
21288 return false;
21289 }
21290
21291 CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(GetDisplayId());
21292 if (!display)
21293 {
21294 return true;
21295 }
21296
21298 if (!displayExtra)
21299 {
21300 return true;
21301 }
21302
21303 CreatureModelDataEntry const* model = sCreatureModelDataStore.LookupEntry(display->ModelId);
21304 ChrRacesEntry const* race = sChrRacesStore.LookupEntry(displayExtra->DisplayRaceID);
21305
21306 if (model && !(model->HasFlag(CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT)))
21307 {
21308 if (race && !(race->HasFlag(CHRRACES_FLAGS_CAN_MOUNT)))
21309 {
21310 return true;
21311 }
21312 }
21313
21314 return false;
21315}
@ CHRRACES_FLAGS_CAN_MOUNT
Definition: DBCStructure.h:674
@ CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT
Definition: DBCStructure.h:770
@ SPELL_ATTR0_ALLOW_WHILE_MOUNTED
Definition: SharedDefines.h:406
uint32 getTransForm() const
Definition: Unit.h:1831
bool HasFlag(ChrRacesFlags flag) const
Definition: DBCStructure.h:699
uint32 ExtendedDisplayInfoID
Definition: DBCStructure.h:724
uint32 DisplayRaceID
Definition: DBCStructure.h:740
bool HasFlag(CreatureModelDataFlags flag) const
Definition: DBCStructure.h:803
uint32 flags1
Definition: DBCStructure.h:1821

References CHRRACES_FLAGS_CAN_MOUNT, CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT, CreatureDisplayInfoExtraEntry::DisplayRaceID, CreatureDisplayInfoEntry::ExtendedDisplayInfoID, SpellShapeshiftFormEntry::flags1, GetDisplayId(), GetNativeDisplayId(), GetShapeshiftForm(), getTransForm(), ChrRacesEntry::HasFlag(), CreatureModelDataEntry::HasFlag(), CreatureDisplayInfoEntry::ModelId, sChrRacesStore, sCreatureDisplayInfoExtraStore, sCreatureDisplayInfoStore, sCreatureModelDataStore, SPELL_ATTR0_ALLOW_WHILE_MOUNTED, sSpellMgr, and sSpellShapeshiftFormStore.

Referenced by Player::ActivateTaxiPathTo(), Spell::CheckCast(), Player::ContinueTaxiFlight(), and Player::ProcessDelayedOperations().

◆ IsInFeralForm()

bool Unit::IsInFeralForm ( ) const
inline

◆ IsInFlight()

bool Unit::IsInFlight ( ) const
inline

◆ isInFrontInMap()

bool Unit::isInFrontInMap ( Unit const *  target,
float  distance,
float  arc = M_PI 
) const
4184{
4185 return IsWithinDistInMap(target, distance) && HasInArc(arc, target);
4186}

References Position::HasInArc(), and WorldObject::IsWithinDistInMap().

◆ IsInnkeeper()

bool Unit::IsInnkeeper ( ) const
inline
@ UNIT_NPC_FLAG_INNKEEPER
Definition: UnitDefines.h:310

References HasNpcFlag(), and UNIT_NPC_FLAG_INNKEEPER.

Referenced by npc_innkeeper::OnGossipHello().

◆ IsInPartyWith()

bool Unit::IsInPartyWith ( Unit const *  unit) const
18776{
18777 if (this == unit)
18778 return true;
18779
18780 Unit const* u1 = GetCharmerOrOwnerOrSelf();
18781 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
18782 if (u1 == u2)
18783 return true;
18784
18785 if (u1->IsPlayer() && u2->IsPlayer())
18786 return u1->ToPlayer()->IsInSameGroupWith(u2->ToPlayer());
18787 // Xinef: we assume that npcs with the same faction are in party
18788 else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
18789 return u1->GetFaction() == u2->GetFaction();
18790 // Xinef: creature type_flag should work for party check only if player group is not a raid
18793 return true;
18794 else
18795 return false;
18796}
bool IsInSameGroupWith(Player const *p) const
Definition: Player.cpp:2310
bool isRaidGroup() const
Definition: Group.cpp:2267

References CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, GetCharmerOrOwnerOrSelf(), Creature::GetCreatureTemplate(), GetFaction(), Player::GetGroup(), IsControlledByPlayer(), Object::IsCreature(), Player::IsInSameGroupWith(), Object::IsPlayer(), Group::isRaidGroup(), Object::ToCreature(), Object::ToPlayer(), and CreatureTemplate::type_flags.

Referenced by SpellInfo::CheckExplicitTarget(), SpellClickInfo::IsFitToRequirements(), Condition::Meets(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ IsInRaidWith()

bool Unit::IsInRaidWith ( Unit const *  unit) const
18799{
18800 if (this == unit)
18801 return true;
18802
18803 Unit const* u1 = GetCharmerOrOwnerOrSelf();
18804 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
18805 if (u1 == u2)
18806 return true;
18807
18808 if (u1->IsPlayer() && u2->IsPlayer())
18809 return u1->ToPlayer()->IsInSameRaidWith(u2->ToPlayer());
18810 // Xinef: we assume that npcs with the same faction are in party
18811 else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
18812 return u1->GetFaction() == u2->GetFaction();
18815 return true;
18816 else
18817 return false;
18818}

References CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, GetCharmerOrOwnerOrSelf(), Creature::GetCreatureTemplate(), GetFaction(), IsControlledByPlayer(), Object::IsCreature(), Player::IsInSameRaidWith(), Object::IsPlayer(), Object::ToCreature(), Object::ToPlayer(), and CreatureTemplate::type_flags.

Referenced by Corpse::BuildValuesUpdate(), SpellInfo::CheckExplicitTarget(), GetReactionTo(), WorldSession::HandleLootMasterGiveOpcode(), SpellClickInfo::IsFitToRequirements(), Condition::Meets(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), and PatchValuesUpdate().

◆ IsInSanctuary()

bool Unit::IsInSanctuary ( ) const
inline

◆ IsInWater()

bool Unit::IsInWater ( ) const
virtual

◆ IsLevitating()

◆ IsMounted()

◆ IsMovementPreventedByCasting()

bool Unit::IsMovementPreventedByCasting ( ) const
virtual

Reimplemented in Creature.

4160{
4161 // can always move when not casting
4163 {
4164 return false;
4165 }
4166
4167 // channeled spells during channel stage (after the initial cast timer) allow movement with a specific spell attribute
4169 {
4170 if (spell->getState() != SPELL_STATE_FINISHED && spell->IsChannelActive())
4171 {
4172 if (spell->GetSpellInfo()->IsActionAllowedChannel())
4173 {
4174 return false;
4175 }
4176 }
4177 }
4178
4179 // prohibit movement for all other spell casts
4180 return true;
4181}
@ UNIT_STATE_CASTING
Definition: UnitDefines.h:164

References CURRENT_CHANNELED_SPELL, HasUnitState(), m_currentSpells, SPELL_STATE_FINISHED, and UNIT_STATE_CASTING.

Referenced by TimedFleeingMovementGenerator::Update().

◆ isMoving()

◆ IsNeutralToAll()

bool Unit::IsNeutralToAll ( ) const
10260{
10261 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10262 if (!my_faction || !my_faction->faction)
10263 return true;
10264
10265 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10266 if (raw_faction && raw_faction->reputationListID >= 0)
10267 return false;
10268
10269 return my_faction->IsNeutralToAll();
10270}
bool IsNeutralToAll() const
Definition: DBCStructure.h:981

References FactionTemplateEntry::faction, GetFactionTemplateEntry(), FactionTemplateEntry::IsNeutralToAll(), FactionEntry::reputationListID, and sFactionStore.

Referenced by Creature::_IsTargetAcceptable(), Creature::CanStartAttack(), AggressorAI::Permissible(), and ReactorAI::Permissible().

◆ IsNonMeleeSpellCast()

bool Unit::IsNonMeleeSpellCast ( bool  withDelayed,
bool  skipChanneled = false,
bool  skipAutorepeat = false,
bool  isAutoshoot = false,
bool  skipInstant = true 
) const
4100{
4101 // We don't do loop here to explicitly show that melee spell is excluded.
4102 // Maybe later some special spells will be excluded too.
4103
4104 // generic spells are cast when they are not finished and not delayed
4107 (withDelayed || m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_DELAYED))
4108 {
4109 if (!skipInstant || m_currentSpells[CURRENT_GENERIC_SPELL]->GetCastTime())
4110 {
4111 if (!isAutoshoot || !m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4112 return true;
4113 }
4114 }
4115 // channeled spells may be delayed, but they are still considered cast
4116 if (!skipChanneled && m_currentSpells[CURRENT_CHANNELED_SPELL] &&
4118 {
4119 if (!isAutoshoot || !m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4120 return true;
4121 }
4122 // autorepeat spells may be finished or delayed, but they are still considered cast
4123 if (!skipAutorepeat && m_currentSpells[CURRENT_AUTOREPEAT_SPELL])
4124 return true;
4125
4126 return false;
4127}
@ SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS
Definition: SharedDefines.h:473

References CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, m_currentSpells, SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_STATE_DELAYED, and SPELL_STATE_FINISHED.

Referenced by Spell::_cast(), _UpdateAutoRepeatSpell(), Player::ActivateSpec(), Player::ActivateTaxiPathTo(), Player::CanEquipItem(), CombatStop(), npc_mograine::npc_mograineAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), ScriptedAI::DoCastSpell(), Spell::EffectKnockBack(), Spell::finish(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), isSpellBlocked(), boss_shade_of_aran::JustEngagedWith(), boss_pandemonius::JustEngagedWith(), MeleeSpellHitResult(), Spell::prepare(), SmartScript::ProcessEvent(), RollMeleeOutcomeAgainst(), spell_item_fetch_ball::SelectTarget(), setDeathState(), StopAttackFaction(), boss_netherspite::SwitchToPortalPhase(), Player::TeleportTo(), TotemAI::UpdateAI(), npc_chesspiece::UpdateAI(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_warmage_violetstand::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ IsOnVehicle()

◆ IsPet()

bool Unit::IsPet ( ) const
inline
754{ return m_unitTypeMask & UNIT_MASK_PET; }
@ UNIT_MASK_PET
Definition: UnitDefines.h:139

References m_unitTypeMask, and UNIT_MASK_PET.

Referenced by Spell::_cast(), Spell::AddUnitTarget(), spell_warl_demonic_pact_aura::AfterCheckProc(), Creature::AllLootRemovedFromCorpse(), BeforeVisibilityDestroy< Creature >(), Creature::CallAssistance(), Creature::CallForHelp(), boss_renataki::boss_renatakiAI::CanAlwaysBeDetectable(), boss_renataki::boss_renatakiAI::CanSeeAlways(), Creature::CanSwim(), ClearInCombat(), CombatStart(), Creature::CreateFromProto(), Player::CreatePet(), DealDamage(), MotionTransport::DelayedTeleportTransport(), PetAI::DoAttack(), ChaseMovementGenerator< T >::DoUpdate(), Spell::EffectDismissPet(), Spell::EffectForceDeselect(), Spell::EffectRenamePet(), Spell::EffectSanctuary(), Spell::EffectSchoolDMG(), Spell::EffectTameCreature(), Acore::XP::Gain(), Creature::GetAggroRange(), GetCastingTimeForBonus(), GetCombatRatingReduction(), GetCreatePowers(), GetNextRandomRaidMemberOrPet(), GetRandomContactPoint(), GetVelocity(), AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModStat(), debug_commandscript::HandleDebugThreatListCommand(), AuraEffect::HandleFeignDeath(), modify_commandscript::HandleModifyTalentCommand(), AuraEffect::HandleModPossessPet(), AuraEffect::HandleModResistancePercent(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcDeleteCommand(), npc_commandscript::HandleNpcSetLevelCommand(), npc_commandscript::HandleNpcSetModelCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), npc_commandscript::HandleNpcTameCommand(), WorldSession::HandlePetAbandon(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetCastSpellOpcode(), pet_commandscript::HandlePetCreateCommand(), WorldSession::HandlePetRename(), WorldSession::HandlePetSetAction(), misc_commandscript::HandleRespawnCommand(), Creature::InitEntry(), TempSummon::InitStats(), Guardian::InitStatsForLevel(), DisableMgr::IsDisabledFor(), Creature::isElite(), Minion::IsGuardianPet(), Player::isHonorOrXPTarget(), Creature::isWorldBoss(), npc_webbed_creature::npc_webbed_creatureAI::JustDied(), npc_underbat::JustEngagedWith(), npc_hivezara_stinger::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_murmur::JustEngagedWith(), Kill(), spell_hun_target_self_and_pet::Load(), ModSpellCastTime(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::MoveInLineOfSight(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::MoveInLineOfSight(), Acore::MostHPMissingGroupInRange::operator()(), PetAI::ReceiveEmote(), RollMeleeOutcomeAgainst(), FactorySelector::SelectAI(), Creature::SelectLevel(), WorldSession::SendPetNameQuery(), Spell::SendSpellGo(), Spell::SendSpellStart(), SetCharm(), Creature::SetDisplayId(), SetHealth(), SetInCombatState(), SetMinion(), Creature::SetObjectScale(), setPowerType(), SpellDamageBonusDone(), SpellPctDamageModsDone(), ToPet(), TempSummon::UnSummon(), Update(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_hazzarah::UpdateAI(), PetAI::UpdateAI(), Player::UpdateAreaDependentAuras(), UpdateAuraForGroup(), Creature::UpdateEntry(), Creature::UpdateMoveInLineOfSightState(), and UpdateSpeed().

◆ IsPetAura()

bool Unit::IsPetAura ( Aura const *  aura)
17338{
17339 Unit* owner = GetOwner();
17340
17341 if (!owner || !owner->IsPlayer())
17342 return false;
17343
17344 // if the owner has that pet aura, return true
17345 for (PetAura const* petAura : owner->m_petAuras)
17346 if (petAura->GetAura(GetEntry()) == aura->GetId())
17347 return true;
17348
17349 return false;
17350}
Definition: SpellMgr.h:470
uint32 GetAura(uint32 petEntry) const
Definition: SpellMgr.h:486

References PetAura::GetAura(), Object::GetEntry(), Aura::GetId(), GetOwner(), Object::IsPlayer(), and m_petAuras.

Referenced by Pet::_SaveAuras(), and Spell::EffectSummonPet().

◆ IsPetInCombat()

bool Unit::IsPetInCombat ( ) const
inline

◆ IsPolymorphed()

bool Unit::IsPolymorphed ( ) const
16743{
16744 uint32 transformId = getTransForm();
16745 if (!transformId)
16746 return false;
16747
16748 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(transformId);
16749 if (!spellInfo)
16750 return false;
16751
16752 return spellInfo->GetSpellSpecific() == SPELL_SPECIFIC_MAGE_POLYMORPH;
16753}
@ SPELL_SPECIFIC_MAGE_POLYMORPH
Definition: SpellInfo.h:160
SpellSpecificType GetSpellSpecific() const
Definition: SpellInfo.cpp:2137

References SpellInfo::GetSpellSpecific(), getTransForm(), SPELL_SPECIFIC_MAGE_POLYMORPH, and sSpellMgr.

Referenced by Attack(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), Player::RegenerateAll(), Creature::RegenerateHealth(), Player::RegenerateHealth(), and Creature::Update().

◆ isPossessed()

◆ isPossessedByPlayer()

bool Unit::isPossessedByPlayer ( ) const
inline

◆ isPossessing() [1/2]

bool Unit::isPossessing ( ) const
inline
1239 {
1240 if (Unit* u = GetCharm())
1241 return u->isPossessed();
1242 else
1243 return false;
1244 }

References GetCharm().

Referenced by WorldSession::HandleCastSpellOpcode(), and misc_commandscript::HandleUnbindSightCommand().

◆ isPossessing() [2/2]

bool Unit::isPossessing ( Unit u) const
inline
1245{ return u->isPossessed() && GetCharmGUID() == u->GetGUID(); }
bool isPossessed() const
Definition: Unit.h:1236

References GetCharmGUID(), Object::GetGUID(), and isPossessed().

◆ IsPvP()

◆ IsQuestGiver()

bool Unit::IsQuestGiver ( ) const
inline
@ UNIT_NPC_FLAG_QUESTGIVER
Definition: UnitDefines.h:295

References HasNpcFlag(), and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_lokhtos_darkbargainer::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_augustus_the_touched::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_cos_chromie_middle::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_braug_dimspirit::OnGossipHello(), npc_steward_of_time::OnGossipHello(), npc_stone_watcher_of_norgannon::OnGossipHello(), npc_rivern_frostwind::OnGossipHello(), npc_fos_leader::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_avatar_of_freya::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_queue::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_captain_saeed::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), npc_taxi::OnGossipHello(), npc_riggle_bassbait::OnGossipHello(), and npc_sayge::OnGossipHello().

◆ IsScriptOverriden()

AuraEffect * Unit::IsScriptOverriden ( SpellInfo const *  spell,
int32  script 
) const
5810{
5812 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5813 {
5814 if ((*i)->GetMiscValue() == script)
5815 if ((*i)->IsAffectedOnSpell(spell))
5816 return (*i);
5817 }
5818 return nullptr;
5819}
@ SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
Definition: SpellAuraDefines.h:175

References GetAuraEffectsByType(), and SPELL_AURA_OVERRIDE_CLASS_SCRIPTS.

Referenced by Spell::CheckCast(), Spell::EffectWeaponDmg(), and AuraEffect::HandleAuraModShapeshift().

◆ IsServiceProvider()

bool Unit::IsServiceProvider ( ) const
inline

◆ IsSitState()

bool Unit::IsSitState ( ) const
16713{
16714 uint8 s = getStandState();
16715 return
16719}
@ UNIT_STAND_STATE_SIT_HIGH_CHAIR
Definition: UnitDefines.h:38
@ UNIT_STAND_STATE_SIT_MEDIUM_CHAIR
Definition: UnitDefines.h:37
@ UNIT_STAND_STATE_SIT_LOW_CHAIR
Definition: UnitDefines.h:36
@ UNIT_STAND_STATE_SIT_CHAIR
Definition: UnitDefines.h:34

References getStandState(), UNIT_STAND_STATE_SIT, UNIT_STAND_STATE_SIT_CHAIR, UNIT_STAND_STATE_SIT_HIGH_CHAIR, UNIT_STAND_STATE_SIT_LOW_CHAIR, and UNIT_STAND_STATE_SIT_MEDIUM_CHAIR.

Referenced by _ApplyAura(), AttackerStateUpdate(), WorldSession::HandleMovementOpcodes(), IsStandState(), Spell::prepare(), and SpellTakenCritChance().

◆ isSpellBlocked()

bool Unit::isSpellBlocked ( Unit victim,
SpellInfo const *  spellProto,
WeaponAttackType  attackType = BASE_ATTACK 
)
3101{
3102 // These spells can't be blocked
3103 if (spellProto && spellProto->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3104 return false;
3105
3106 if (victim->HasIgnoreHitDirectionAura() || victim->HasInArc(M_PI, this))
3107 {
3108 // Check creatures flags_extra for disable block
3109 if (victim->IsCreature() &&
3111 return false;
3112
3113 float blockChance = victim->GetUnitBlockChance();
3114 blockChance += (int32(GetWeaponSkillValue(attackType)) - int32(victim->GetMaxSkillValueForLevel())) * 0.04f;
3115
3116 // xinef: cant block while casting or while stunned
3117 if (blockChance < 0.0f || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3118 blockChance = 0.0f;
3119
3120 if (roll_chance_f(blockChance))
3121 return true;
3122 }
3123 return false;
3124}
@ SPELL_ATTR0_NO_ACTIVE_DEFENSE
Definition: SharedDefines.h:403
@ UNIT_STATE_CONTROLLED
Definition: UnitDefines.h:190
@ CREATURE_FLAG_EXTRA_NO_BLOCK
Definition: CreatureData.h:49
bool HasIgnoreHitDirectionAura() const
Definition: Unit.h:1673
uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const *target=nullptr) const
Definition: Unit.cpp:3790
float GetUnitBlockChance() const
Definition: Unit.cpp:3702

References CREATURE_FLAG_EXTRA_NO_BLOCK, CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), GetMaxSkillValueForLevel(), GetUnitBlockChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), Object::IsCreature(), IsNonMeleeSpellCast(), roll_chance_f(), SPELL_ATTR0_NO_ACTIVE_DEFENSE, Object::ToCreature(), and UNIT_STATE_CONTROLLED.

Referenced by CalculateSpellDamageTaken().

◆ IsSpiritGuide()

bool Unit::IsSpiritGuide ( ) const
inline

◆ IsSpiritHealer()

bool Unit::IsSpiritHealer ( ) const
inline

◆ IsSpiritService()

◆ IsStandState()

◆ IsStopped()

bool Unit::IsStopped ( ) const
inline

◆ IsSummon()

bool Unit::IsSummon ( ) const
inline
@ UNIT_MASK_SUMMON
Definition: UnitDefines.h:135

References m_unitTypeMask, and UNIT_MASK_SUMMON.

Referenced by Creature::CanPeriodicallyCallForAssistance(), spell_item_unsated_craving::CheckProc(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), Spell::EffectScriptEffect(), boss_skeram::EnterEvadeMode(), npc_phantom_hallucination::npc_phantom_hallucinationAI::EnterEvadeMode(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::EnterEvadeMode(), SuckBackEvent::Execute(), Spell::finish(), GetAllMinionsByEntry(), SmartScript::GetTargets(), WorldSession::HandleDismissCritter(), spell_pri_lightwell::HandleScriptEffect(), TempSummon::InitStats(), SpellClickInfo::IsFitToRequirements(), boss_skeram::JustDied(), boss_tyrannus::boss_tyrannusAI::JustDied(), boss_freya_iron_root::boss_freya_iron_rootAI::JustDied(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::JustDied(), npc_counselor_talbot::npc_counselor_talbotAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), npc_pet_dk_ghoul::npc_pet_dk_ghoulAI::JustDied(), npc_pet_pri_shadowfiend::JustDied(), boss_skeram::JustEngagedWith(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::JustEngagedWith(), npc_tiger_matriarch::npc_tiger_matriarchAI::KilledUnit(), npc_leryssa::npc_leryssaAI::MovementInform(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), BattlefieldWG::OnCreatureCreate(), InstanceScript::OnCreatureCreate(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnCreatureCreate(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::OnCreatureCreate(), npc_wormhole::OnGossipHello(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnUnitDeath(), RemoveAllControlled(), RemoveAllMinionsByEntry(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::Reset(), npc_plaguehound_tracker::npc_plaguehound_trackerAI::Reset(), Creature::SaveRespawnTime(), Creature::SearchFormation(), Spell::SelectImplicitCasterObjectTargets(), Creature::SelectVictim(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), ToTempSummon(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_skeram::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_ulduar_flash_freeze::npc_ulduar_flash_freezeAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), and Player::VehicleSpellInitialize().

◆ isSwimming()

◆ IsTabardDesigner()

bool Unit::IsTabardDesigner ( ) const
inline

◆ isTargetableForAttack()

◆ IsTaxi()

bool Unit::IsTaxi ( ) const
inline

◆ IsTotem()

◆ IsTrainer()

◆ IsTriggeredAtSpellProcEvent()

bool Unit::IsTriggeredAtSpellProcEvent ( Unit victim,
Aura aura,
WeaponAttackType  attType,
bool  isVictim,
bool  active,
SpellProcEventEntry const *&  spellProcEvent,
ProcEventInfo const &  eventInfo 
)
private
17425{
17426 SpellInfo const* spellProto = aura->GetSpellInfo();
17427 SpellInfo const* procSpell = eventInfo.GetSpellInfo();
17428
17429 // let the aura be handled by new proc system if it has new entry
17430 if (sSpellMgr->GetSpellProcEntry(spellProto->Id))
17431 return false;
17432
17433 // Get proc Event Entry
17434 spellProcEvent = sSpellMgr->GetSpellProcEvent(spellProto->Id);
17435
17436 // Get EventProcFlag
17437 uint32 EventProcFlag;
17438 if (spellProcEvent && spellProcEvent->procFlags) // if exist get custom spellProcEvent->procFlags
17439 EventProcFlag = spellProcEvent->procFlags;
17440 else
17441 EventProcFlag = spellProto->ProcFlags; // else get from spell proto
17442 // Continue if no trigger exist
17443 if (!EventProcFlag)
17444 return false;
17445
17446 // Additional checks for triggered spells (ignore trap casts)
17447 //if (procExtra & PROC_EX_INTERNAL_TRIGGERED && !(procFlag & PROC_FLAG_DONE_TRAP_ACTIVATION))
17448 //{
17449 // if (!spellProto->HasAttribute(SPELL_ATTR3_CAN_PROC_TRIGGERED))
17450 // return false;
17451 //}
17452
17453 // Xinef: additional check for player auras - only player spells can trigger player proc auras
17454 // Xinef: skip victim auras
17455 // Excluded player shoot spells
17456 // Excluded player item spells
17457 if (!isVictim && IsPlayer() && !(EventProcFlag & (PROC_FLAG_KILL | PROC_FLAG_DEATH)))
17458 {
17459 if (procSpell && procSpell->SpellFamilyName == SPELLFAMILY_GENERIC && procSpell->GetCategory() != 76 &&
17460 (!eventInfo.GetProcSpell() || !eventInfo.GetProcSpell()->m_CastItem) &&
17461 (!eventInfo.GetTriggerAuraSpell() || eventInfo.GetTriggerAuraSpell()->SpellFamilyName == SPELLFAMILY_GENERIC))
17462 {
17463 return false;
17464 }
17465 }
17466
17467 // Check spellProcEvent data requirements
17468 if (!sSpellMgr->IsSpellProcEventCanTriggeredBy(spellProto, spellProcEvent, EventProcFlag, eventInfo, active))
17469 return false;
17470 // In most cases req get honor or XP from kill
17471 if (EventProcFlag & PROC_FLAG_KILL && IsPlayer())
17472 {
17473 bool allow = false;
17474
17475 if (victim)
17476 allow = ToPlayer()->isHonorOrXPTarget(victim);
17477
17478 // Shadow Word: Death - can trigger from every kill
17479 if (aura->GetId() == 32409 || aura->GetId() == 18372 || aura->GetId() == 18213)
17480 allow = true;
17481 if (!allow)
17482 return false;
17483 }
17484 // Aura added by spell can`t trigger from self (prevent drop charges/do triggers)
17485 // But except periodic and kill triggers (can triggered from self)
17486 if (procSpell && procSpell->Id == spellProto->Id
17487 && !(spellProto->ProcFlags & (PROC_FLAG_TAKEN_PERIODIC | PROC_FLAG_KILL)))
17488 return false;
17489
17490 // Check if current equipment allows aura to proc
17491 if (!isVictim && IsPlayer() && !spellProto->HasAttribute(SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT))
17492 {
17493 Player* player = ToPlayer();
17494 if (spellProto->EquippedItemClass == ITEM_CLASS_WEAPON)
17495 {
17496 Item* item = nullptr;
17497 if (attType == BASE_ATTACK)
17499 else if (attType == OFF_ATTACK)
17501 else
17503
17504 if (player->IsInFeralForm())
17505 return false;
17506
17507 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_WEAPON || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17508 return false;
17509 }
17510 else if (spellProto->EquippedItemClass == ITEM_CLASS_ARMOR)
17511 {
17512 // Check if player is wearing shield
17514 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_ARMOR || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17515 return false;
17516 }
17517 }
17518 // Get chance from spell
17519 float chance = float(spellProto->ProcChance);
17520 // If in spellProcEvent exist custom chance, chance = spellProcEvent->customChance;
17521 if (spellProcEvent && spellProcEvent->customChance)
17522 chance = spellProcEvent->customChance;
17523 // If PPM exist calculate chance from PPM
17524 if (spellProcEvent && spellProcEvent->ppmRate != 0)
17525 {
17526 if (!isVictim)
17527 {
17528 uint32 WeaponSpeed = GetAttackTime(attType);
17529 chance = GetPPMProcChance(WeaponSpeed, spellProcEvent->ppmRate, spellProto);
17530 }
17531 else if (victim)
17532 {
17533 uint32 WeaponSpeed = victim->GetAttackTime(attType);
17534 chance = victim->GetPPMProcChance(WeaponSpeed, spellProcEvent->ppmRate, spellProto);
17535 }
17536 }
17537
17538 // Custom chances
17539 switch (spellProto->SpellFamilyName)
17540 {
17542 {
17543 // Recklessness, allow to proc only once for whirlwind
17544 if (spellProto->Id == 1719 && procSpell && procSpell->Id == 44949)
17545 return false;
17546 }
17547 }
17548
17549 if (eventInfo.GetProcChance())
17550 {
17551 chance = *eventInfo.GetProcChance();
17552 }
17553
17554 // Apply chance modifer aura
17555 if (Player* modOwner = GetSpellModOwner())
17556 {
17557 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CHANCE_OF_SUCCESS, chance);
17558 }
17559
17560 return roll_chance_f(chance);
17561}
@ SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT
Definition: SharedDefines.h:494
@ SPELLMOD_CHANCE_OF_SUCCESS
Definition: SpellDefines.h:94
@ PROC_FLAG_DEATH
Definition: SpellMgr.h:143
@ PROC_FLAG_TAKEN_PERIODIC
Definition: SpellMgr.h:135
@ PROC_FLAG_KILL
Definition: SpellMgr.h:108
@ EQUIPMENT_SLOT_RANGED
Definition: Player.h:692
@ ITEM_CLASS_ARMOR
Definition: ItemTemplate.h:295
@ ITEM_CLASS_WEAPON
Definition: ItemTemplate.h:293
uint32 Class
Definition: ItemTemplate.h:621
uint32 SubClass
Definition: ItemTemplate.h:622
Item * GetUseableItemByPos(uint8 bag, uint8 slot) const
Definition: Player.h:1244
bool isHonorOrXPTarget(Unit *victim) const
Definition: Player.cpp:12676
float GetPPMProcChance(uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
Definition: Unit.cpp:13451
uint32 GetCategory() const
Definition: SpellInfo.cpp:871
int32 EquippedItemClass
Definition: SpellInfo.h:375
uint32 ProcFlags
Definition: SpellInfo.h:355
int32 EquippedItemSubClassMask
Definition: SpellInfo.h:376

References BASE_ATTACK, ItemTemplate::Class, SpellProcEventEntry::customChance, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, SpellInfo::EquippedItemClass, SpellInfo::EquippedItemSubClassMask, GetAttackTime(), SpellInfo::GetCategory(), Aura::GetId(), GetPPMProcChance(), ProcEventInfo::GetProcChance(), ProcEventInfo::GetProcSpell(), ProcEventInfo::GetSpellInfo(), Aura::GetSpellInfo(), GetSpellModOwner(), Item::GetTemplate(), ProcEventInfo::GetTriggerAuraSpell(), Player::GetUseableItemByPos(), SpellInfo::HasAttribute(), SpellInfo::Id, INVENTORY_SLOT_BAG_0, Item::IsBroken(), Player::isHonorOrXPTarget(), IsInFeralForm(), Object::IsPlayer(), ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, Spell::m_CastItem, OFF_ATTACK, SpellProcEventEntry::ppmRate, PROC_FLAG_DEATH, PROC_FLAG_KILL, PROC_FLAG_TAKEN_PERIODIC, SpellInfo::ProcChance, SpellInfo::ProcFlags, SpellProcEventEntry::procFlags, roll_chance_f(), SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT, SPELLFAMILY_GENERIC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyName, SPELLMOD_CHANCE_OF_SUCCESS, sSpellMgr, ItemTemplate::SubClass, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ isTurning()

bool Unit::isTurning ( ) const
inline

◆ IsUnderLastManaUseEffect()

bool Unit::IsUnderLastManaUseEffect ( ) const

◆ IsUnderWater()

bool Unit::IsUnderWater ( ) const
virtual
4345{
4347}
@ LIQUID_MAP_UNDER_WATER
Definition: Map.h:146

References WorldObject::GetLiquidData(), LIQUID_MAP_UNDER_WATER, and LiquidData::Status.

Referenced by Creature::setDeathState().

◆ IsValidAssistTarget()

bool Unit::IsValidAssistTarget ( Unit const *  target) const
13995{
13996 return _IsValidAssistTarget(target, nullptr);
13997}
bool _IsValidAssistTarget(Unit const *target, SpellInfo const *bySpell) const
Definition: Unit.cpp:14000

References _IsValidAssistTarget().

Referenced by SmartAI::AssistPlayerInCombatAgainst().

◆ IsValidAttackTarget()

bool Unit::IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell = nullptr 
) const
13872{
13873 return _IsValidAttackTarget(target, bySpell);
13874}

References _IsValidAttackTarget().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), CreatureGroup::GetNewTargetForMember(), WorldSession::HandleAttackSwingOpcode(), npc_beryl_sorcerer::npc_beryl_sorcererAI::JustEngagedWith(), CreatureGroup::MemberEngagingTarget(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), boss_kaelthas::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestHostileUnitCheck::operator()(), MalleableGooSelector::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), CreatureAI::SetGazeOn(), StopAttackingInvalidTarget(), SimpleCharmedAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), PossessedAI::UpdateAI(), Player::UpdateCharmedAI(), Player::UpdateFFAPvPFlag(), and Player::UpdateFFAPvPState().

◆ IsVehicle()

bool Unit::IsVehicle ( ) const
inline

◆ IsVendor()

◆ IsVisible()

bool Unit::IsVisible ( ) const
inline
@ SEC_PLAYER
Definition: Common.h:57
@ SERVERSIDE_VISIBILITY_GM
Definition: SharedDefines.h:1273
T_VALUES GetValue(FLAG_TYPE flag) const
Definition: Object.h:371

References FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::GetValue(), WorldObject::m_serverSideVisibility, SEC_PLAYER, and SERVERSIDE_VISIBILITY_GM.

Referenced by npc_ghostly_priest::npc_ghostly_priestAI::AttackStart(), npc_phantom_mage::npc_phantom_mageAI::AttackStart(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::AttackStart(), npc_spectral_footman::npc_spectral_footmanAI::AttackStart(), npc_tortured_rifleman::npc_tortured_riflemanAI::AttackStart(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::CanAIAttack(), boss_professor_putricide::boss_professor_putricideAI::CanAIAttack(), boss_sindragosa::boss_sindragosaAI::CanAIAttack(), boss_the_lich_king::boss_the_lich_kingAI::CanAIAttack(), SpellInfo::CheckTarget(), AuraEffect::HandlePhase(), Player::IsVisibleGloballyFor(), boss_the_lich_king::boss_the_lich_kingAI::JustEngagedWith(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::JustEngagedWith(), Acore::AllFriendlyCreaturesInGrid::operator()(), boss_sapphiron::boss_sapphironAI::Reset(), npc_pos_leader::npc_pos_leaderAI::SetData(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), boss_taldaram::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), and boss_vazruden_the_herald::UpdateAI().

◆ IsWalking()

◆ IsWithinCombatRange()

bool Unit::IsWithinCombatRange ( Unit const *  obj,
float  dist2compare 
) const

◆ IsWithinMeleeRange()

bool Unit::IsWithinMeleeRange ( Unit const *  obj,
float  dist = 0.f 
) const
665{
666 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
667 return false;
668
669 float dx = GetPositionX() - obj->GetPositionX();
670 float dy = GetPositionY() - obj->GetPositionY();
671 float dz = GetPositionZ() - obj->GetPositionZ();
672 float distsq = dx * dx + dy * dy + dz * dz;
673
674 float maxdist = dist + GetMeleeRange(obj);
675
676 return distsq < maxdist * maxdist;
677}

References GetMeleeRange(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::InSamePhase(), and WorldObject::IsInMap().

Referenced by boss_marli::_chargePlayer(), boss_swamplord_muselek::AttackStart(), SmartAI::AttackStart(), boss_ragnaros::boss_ragnarosAI::CanAIAttack(), boss_ouro::CanAIAttack(), boss_murmur::CanAIAttack(), boss_alar::CanAIAttack(), PetAI::CanAttack(), Spell::CheckRange(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), spell_shazzrah_gate_dummy::FilterTargets(), boss_supremus::FindHatefulStrikeTarget(), boss_ouro::IsPlayerWithinMeleeRange(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), boss_swamplord_muselek::JustEngagedWith(), boss_vem::JustEngagedWith(), CreatureAI::MoveCircleChecks(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), SpellTargetSelector::operator()(), SmartScript::ProcessEvent(), ThreatContainer::SelectNextVictim(), boss_murmur::ShouldCastResonance(), boss_quartermaster_zigris::SpellHitTarget(), Player::Update(), boss_quartermaster_zigris::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_skeram::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), PetAI::UpdateAI(), npc_zuljin_vortex::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), and boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI().

◆ IsWithinRange()

bool Unit::IsWithinRange ( Unit const *  obj,
float  dist 
) const
686{
687 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
688 {
689 return false;
690 }
691
692 auto dx = GetPositionX() - obj->GetPositionX();
693 auto dy = GetPositionY() - obj->GetPositionY();
694 auto dz = GetPositionZ() - obj->GetPositionZ();
695 auto distsq = dx * dx + dy * dy + dz * dz;
696
697 return distsq <= dist * dist;
698}

References Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::InSamePhase(), and WorldObject::IsInMap().

Referenced by boss_swamplord_muselek::CanShootVictim().

◆ JumpTo() [1/2]

void Unit::JumpTo ( float  speedXY,
float  speedZ,
bool  forward = true 
)
19526{
19527 float angle = forward ? 0 : M_PI;
19528 if (IsCreature())
19529 GetMotionMaster()->MoveJumpTo(angle, speedXY, speedZ);
19530 else
19531 {
19532 float vcos = cos(angle + GetOrientation());
19533 float vsin = std::sin(angle + GetOrientation());
19534
19535 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19536 data << GetPackGUID();
19537 data << uint32(0); // Sequence
19538 data << float(vcos); // x direction
19539 data << float(vsin); // y direction
19540 data << float(speedXY); // Horizontal speed
19541 data << float(-speedZ); // Z Movement speed (vertical)
19542
19543 ToPlayer()->GetSession()->SendPacket(&data);
19544 }
19545}
@ SMSG_MOVE_KNOCK_BACK
Definition: Opcodes.h:269
WorldSession * GetSession() const
Definition: Player.h:1981
void MoveJumpTo(float angle, float speedXY, float speedZ)
The unit will jump in a specific direction.
Definition: MotionMaster.cpp:587
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition: WorldSession.cpp:214

References GetMotionMaster(), Position::GetOrientation(), Object::GetPackGUID(), Player::GetSession(), Object::IsCreature(), MotionMaster::MoveJumpTo(), WorldSession::SendPacket(), SMSG_MOVE_KNOCK_BACK, and Object::ToPlayer().

Referenced by Spell::EffectLeapBack().

◆ JumpTo() [2/2]

void Unit::JumpTo ( WorldObject obj,
float  speedZ 
)
19548{
19549 float x, y, z;
19550 obj->GetContactPoint(this, x, y, z);
19551 float speedXY = GetExactDist2d(x, y) * 10.0f / speedZ;
19552 GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ);
19553}
void GetContactPoint(WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
Definition: Object.cpp:2742
void MoveJump(Position const &pos, float speedXY, float speedZ, uint32 id=0)
Definition: MotionMaster.h:229

References WorldObject::GetContactPoint(), Position::GetExactDist2d(), GetMotionMaster(), and MotionMaster::MoveJump().

◆ Kill()

void Unit::Kill ( Unit killer,
Unit victim,
bool  durabilityLoss = true,
WeaponAttackType  attackType = BASE_ATTACK,
SpellInfo const *  spellProto = nullptr,
Spell const *  spell = nullptr 
)
static
Todo:
: do instance binding anyway if the charmer/owner is offline
17704{
17705 // Prevent killing unit twice (and giving reward from kill twice)
17706 if (!victim->GetHealth())
17707 return;
17708
17709 if (killer && !killer->IsInMap(victim))
17710 killer = nullptr;
17711
17712 // find player: owner of controlled `this` or `this` itself maybe
17713 Player* player = killer ? killer->GetCharmerOrOwnerPlayerOrPlayerItself() : nullptr;
17714 Creature* creature = victim->ToCreature();
17715
17716 bool isRewardAllowed = true;
17717 if (creature)
17718 {
17719 isRewardAllowed = creature->IsDamageEnoughForLootingAndReward();
17720 if (!isRewardAllowed)
17721 creature->SetLootRecipient(nullptr);
17722 }
17723
17724 // pussywizard: remade this if section (player is on the same map
17725 if (isRewardAllowed && creature)
17726 {
17727 Player* lr = creature->GetLootRecipient();
17728 if (lr && lr->IsInMap(creature))
17729 player = creature->GetLootRecipient();
17730 else if (Group* lrg = creature->GetLootRecipientGroup())
17731 for (GroupReference* itr = lrg->GetFirstMember(); itr != nullptr; itr = itr->next())
17732 if (Player* member = itr->GetSource())
17733 if (member->IsAtLootRewardDistance(creature))
17734 {
17735 player = member;
17736 break;
17737 }
17738 }
17739
17740 // Exploit fix
17741 if (creature && creature->IsPet() && creature->GetOwnerGUID().IsPlayer())
17742 isRewardAllowed = false;
17743
17744 // Reward player, his pets, and group/raid members
17745 // call kill spell proc event (before real die and combat stop to triggering auras removed at death/combat stop)
17746 if (isRewardAllowed && player && player != victim)
17747 {
17748 WorldPacket data(SMSG_PARTYKILLLOG, (8 + 8)); // send event PARTY_KILL
17749 data << player->GetGUID(); // player with killing blow
17750 data << victim->GetGUID(); // victim
17751
17752 Player* looter = player;
17753 Group* group = player->GetGroup();
17754 bool hasLooterGuid = false;
17755
17756 if (group)
17757 {
17758 group->BroadcastPacket(&data, group->GetMemberGroup(player->GetGUID()));
17759
17760 if (creature)
17761 {
17762 group->UpdateLooterGuid(creature, true);
17763 if (group->GetLooterGuid() && group->GetLootMethod() != FREE_FOR_ALL)
17764 {
17765 looter = ObjectAccessor::FindPlayer(group->GetLooterGuid());
17766 if (looter)
17767 {
17768 hasLooterGuid = true;
17769 creature->SetLootRecipient(looter); // update creature loot recipient to the allowed looter.
17770 }
17771 }
17772 }
17773 }
17774 else
17775 {
17776 player->SendDirectMessage(&data);
17777
17778 if (creature)
17779 {
17780 WorldPacket data2(SMSG_LOOT_LIST, 8 + 1 + 1);
17781 data2 << creature->GetGUID();
17782 data2 << uint8(0); // unk1
17783 data2 << uint8(0); // no group looter
17784 player->SendMessageToSet(&data2, true);
17785 }
17786 }
17787
17788 // Generate loot before updating looter
17789 if (creature)
17790 {
17791 Loot* loot = &creature->loot;
17792 loot->clear();
17793
17794 if (uint32 lootid = creature->GetCreatureTemplate()->lootid)
17795 loot->FillLoot(lootid, LootTemplates_Creature, looter, false, false, creature->GetLootMode(), creature);
17796
17797 if (creature->GetLootMode())
17799
17800 if (group)
17801 {
17802 if (hasLooterGuid)
17803 group->SendLooter(creature, looter);
17804 else
17805 group->SendLooter(creature, nullptr);
17806
17807 // Update round robin looter only if the creature had loot
17808 if (!creature->loot.empty())
17809 group->UpdateLooterGuid(creature);
17810 }
17811 }
17812
17813 player->RewardPlayerAndGroupAtKill(victim, false);
17814 }
17815
17816 // Do KILL and KILLED procs. KILL proc is called only for the unit who landed the killing blow (and its owner - for pets and totems) regardless of who tapped the victim
17817 if (killer && (killer->IsPet() || killer->IsTotem()))
17818 if (Unit* owner = killer->GetOwner())
17819 {
17820 Unit::ProcDamageAndSpell(owner, victim, PROC_FLAG_KILL, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17821 sScriptMgr->OnCreatureKilledByPet( killer->GetCharmerOrOwnerPlayerOrPlayerItself(), victim->ToCreature());
17822 }
17823
17824 if (killer != victim)
17825 {
17826 Unit::ProcDamageAndSpell(killer, victim, killer ? PROC_FLAG_KILL : 0, PROC_FLAG_KILLED, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17827 }
17828
17829 // Proc auras on death - must be before aura/combat remove
17830 Unit::ProcDamageAndSpell(victim, nullptr, PROC_FLAG_DEATH, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17831
17832 // update get killing blow achievements, must be done before setDeathState to be able to require auras on target
17833 // and before Spirit of Redemption as it also removes auras
17834 if (killer)
17835 if (Player* killerPlayer = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
17836 killerPlayer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, victim);
17837
17838 // Spirit of Redemption
17839 // if talent known but not triggered (check priest class for speedup check)
17840 bool spiritOfRedemption = false;
17842 {
17843 if (AuraEffect* aurEff = victim->GetAuraEffectDummy(20711))
17844 {
17845 // Xinef: aura_spirit_of_redemption is triggered by 27827 shapeshift
17846 if (victim->HasSpiritOfRedemptionAura() || victim->HasAura(27827))
17847 {
17848 /*LOG_INFO("misc", "Player ({}) died with spirit of redemption. Killer (Entry: {}, Name: {}), Map: {}, x: {}, y: {}, z: {}",
17849 victim->GetGUID().ToString(), killer ? killer->GetEntry() : 1, killer ? killer->GetName() : "", victim->GetMapId(), victim->GetPositionX(),
17850 victim->GetPositionY(), victim->GetPositionZ());
17851
17852 ACE_Stack_Trace trace(0, 50);
17853 LOG_INFO("misc", "TRACE: {}\n\n", trace);*/
17854 }
17855 else
17856 {
17857 // save value before aura remove
17858 uint32 ressSpellId = victim->GetUInt32Value(PLAYER_SELF_RES_SPELL);
17859 if (!ressSpellId)
17860 ressSpellId = victim->ToPlayer()->GetResurrectionSpellId();
17861
17862 //Remove all expected to remove at death auras (most important negative case like DoT or periodic triggers)
17863 victim->RemoveAllAurasOnDeath();
17864
17865 // Stop attacks
17866 victim->CombatStop();
17868
17869 // restore for use at real death
17870 victim->SetUInt32Value(PLAYER_SELF_RES_SPELL, ressSpellId);
17871
17872 // FORM_SPIRITOFREDEMPTION and related auras
17873 victim->CastSpell(victim, 27827, true, nullptr, aurEff);
17874 spiritOfRedemption = true;
17875 }
17876 }
17877 }
17878
17879 if (!spiritOfRedemption)
17880 {
17881 LOG_DEBUG("entities.unit", "SET DeathState::JustDied");
17882 victim->setDeathState(DeathState::JustDied);
17883 }
17884
17885 // Inform pets (if any) when player kills target)
17886 // MUST come after victim->setDeathState(DeathState::JustDied); or pet next target
17887 // selection will get stuck on same target and break pet react state
17888 if (player)
17889 {
17890 Pet* pet = player->GetPet();
17891 if (pet && pet->IsAlive() && pet->isControlled())
17892 pet->AI()->KilledUnit(victim);
17893 }
17894
17895 // 10% durability loss on death
17896 // clean InHateListOf
17897 if (Player* plrVictim = victim->ToPlayer())
17898 {
17899 // remember victim PvP death for corpse type and corpse reclaim delay
17900 // at original death (not at SpiritOfRedemtionTalent timeout)
17901 plrVictim->SetPvPDeath(player != nullptr);
17902
17903 // only if not player and not controlled by player pet. And not at BG
17904 if ((durabilityLoss && !player && !plrVictim->InBattleground()) || (player && sWorld->getBoolConfig(CONFIG_DURABILITY_LOSS_IN_PVP)))
17905 {
17906 LOG_DEBUG("entities.unit", "We are dead, losing {} percent durability", sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH));
17907 plrVictim->DurabilityLossAll(sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH), false);
17908 // durability lost message
17909 plrVictim->SendDurabilityLoss();
17910 }
17911 // Call KilledUnit for creatures
17912 if (killer && killer->IsCreature() && killer->IsAIEnabled)
17913 killer->ToCreature()->AI()->KilledUnit(victim);
17914
17915 // last damage from non duel opponent or opponent controlled creature
17916 if (plrVictim->duel)
17917 {
17918 plrVictim->duel->Opponent->CombatStopWithPets(true);
17919 plrVictim->CombatStopWithPets(true);
17920 plrVictim->DuelComplete(DUEL_INTERRUPTED);
17921 }
17922 }
17923 else // creature died
17924 {
17925 LOG_DEBUG("entities.unit", "DealDamageNotPlayer");
17926
17927 if (!creature->IsPet() && creature->GetLootMode() > 0)
17928 {
17929 creature->GetThreatMgr().ClearAllThreat();
17930
17931 // must be after setDeathState which resets dynamic flags
17932 if (!creature->loot.isLooted())
17933 {
17935 }
17936 else
17937 {
17938 creature->AllLootRemovedFromCorpse();
17939 }
17940 }
17941
17942 // Call KilledUnit for creatures, this needs to be called after the lootable flag is set
17943 if (killer && killer->IsCreature() && killer->IsAIEnabled)
17944 killer->ToCreature()->AI()->KilledUnit(victim);
17945
17946 // Call creature just died function
17947 if (CreatureAI* ai = creature->AI())
17948 {
17949 ai->JustDied(killer);
17950 }
17951
17952 if (TempSummon* summon = creature->ToTempSummon())
17953 {
17954 if (WorldObject* summoner = summon->GetSummoner())
17955 {
17956 if (summoner->ToCreature() && summoner->ToCreature()->IsAIEnabled)
17957 {
17958 summoner->ToCreature()->AI()->SummonedCreatureDies(creature, killer);
17959 }
17960 else if (summoner->ToGameObject() && summoner->ToGameObject()->AI())
17961 {
17962 summoner->ToGameObject()->AI()->SummonedCreatureDies(creature, killer);
17963 }
17964 }
17965 }
17966
17967 // Dungeon specific stuff, only applies to players killing creatures
17968 if (creature->GetInstanceId())
17969 {
17970 Map* instanceMap = creature->GetMap();
17971 //Player* creditedPlayer = GetCharmerOrOwnerPlayerOrPlayerItself();
17973
17974 if (instanceMap->IsDungeon() && player)
17975 if (instanceMap->IsRaidOrHeroicDungeon())
17977 instanceMap->ToInstanceMap()->PermBindAllPlayers();
17978 }
17979 }
17980
17981 // outdoor pvp things, do these after setting the death state, else the player activity notify won't work... doh...
17982 // handle player kill only if not suicide (spirit of redemption for example)
17983 if (player && killer != victim)
17984 {
17985 if (OutdoorPvP* pvp = player->GetOutdoorPvP())
17986 pvp->HandleKill(player, victim);
17987
17988 if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetZoneId()))
17989 bf->HandleKill(player, victim);
17990 }
17991
17992 //if (victim->IsPlayer())
17993 // if (OutdoorPvP* pvp = victim->ToPlayer()->GetOutdoorPvP())
17994 // pvp->HandlePlayerActivityChangedpVictim->ToPlayer();
17995
17996 // battleground things (do this at the end, so the death state flag will be properly set to handle in the bg->handlekill)
17997 if (player)
17998 if (Battleground* bg = player->GetBattleground())
17999 {
18000 if (victim->IsPlayer())
18001 bg->HandleKillPlayer(victim->ToPlayer(), player);
18002 else
18003 bg->HandleKillUnit(victim->ToCreature(), player);
18004 }
18005
18006 // achievement stuff
18007 if (killer && victim->IsPlayer())
18008 {
18009 if (killer->IsCreature())
18011 else if (victim != killer && killer->IsPlayer())
18013 }
18014
18015 // Hook for OnPVPKill Event
18016 if (killer)
18017 {
18018 if (Player* killerPlr = killer->ToPlayer())
18019 {
18020 if (Player* killedPlr = victim->ToPlayer())
18021 sScriptMgr->OnPVPKill(killerPlr, killedPlr);
18022 else if (Creature* killedCre = victim->ToCreature())
18023 sScriptMgr->OnCreatureKill(killerPlr, killedCre);
18024 }
18025 else if (Creature* killerCre = killer->ToCreature())
18026 {
18027 if (Player* killed = victim->ToPlayer())
18028 sScriptMgr->OnPlayerKilledByCreature(killerCre, killed);
18029 }
18030 }
18031
18032 sScriptMgr->OnUnitDeath(victim, killer);
18033}
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER
Definition: DBCEnums.h:138
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE
Definition: DBCEnums.h:137
@ ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS
Definition: DBCEnums.h:170
@ UNIT_DYNFLAG_LOOTABLE
Definition: SharedDefines.h:3121
@ DUEL_INTERRUPTED
Definition: SharedDefines.h:3612
#define sBattlefieldMgr
Definition: BattlefieldMgr.h:77
@ PROC_FLAG_KILLED
Definition: SpellMgr.h:107
@ CONFIG_DURABILITY_LOSS_IN_PVP
Definition: IWorld.h:66
@ RATE_DURABILITY_LOSS_ON_DEATH
Definition: IWorld.h:512
@ PLAYER_FLAGS_IS_OUT_OF_BOUNDS
Definition: Player.h:488
@ PLAYER_SELF_RES_SPELL
Definition: UpdateFields.h:370
@ CREATURE_FLAG_EXTRA_INSTANCE_BIND
Definition: CreatureData.h:45
LootStore LootTemplates_Creature("creature_loot_template", "creature entry", true)
@ FREE_FOR_ALL
Definition: LootMgr.h:58
@ SMSG_PARTYKILLLOG
Definition: Opcodes.h:531
@ SMSG_LOOT_LIST
Definition: Opcodes.h:1047
Player * FindPlayer(ObjectGuid const guid)
Definition: ObjectAccessor.cpp:245
Definition: CreatureAI.h:70
virtual void KilledUnit(Unit *)
Definition: CreatureAI.h:131
Definition: Battlefield.h:204
Loot loot
Definition: Creature.h:226
uint16 GetLootMode() const
Definition: Creature.h:240
void AllLootRemovedFromCorpse()
Definition: Creature.cpp:2988
Player * GetLootRecipient() const
Definition: Creature.cpp:1306
bool IsDamageEnoughForLootingAndReward() const
Definition: Creature.cpp:3801
Group * GetLootRecipientGroup() const
Definition: Creature.cpp:1313
uint32 mingold
Definition: CreatureData.h:231
uint32 maxgold
Definition: CreatureData.h:232
uint32 lootid
Definition: CreatureData.h:224
virtual void SetDynamicFlag(uint32 flag)
Definition: Object.h:120
uint32 GetInstanceId() const
Definition: Object.h:443
uint32 GetZoneId() const
Definition: Object.cpp:3146
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:5701
TeamId GetTeamId(bool original=false) const
Definition: Player.h:2091
Battleground * GetBattleground(bool create=false) const
Definition: Player.cpp:12203
uint32 GetResurrectionSpellId()
Definition: Player.cpp:12619
OutdoorPvP * GetOutdoorPvP() const
Definition: Player.cpp:12520
void RewardPlayerAndGroupAtKill(Unit *victim, bool isBattleGround)
Definition: Player.cpp:12739
void RemoveAllAurasOnDeath()
Definition: Unit.cpp:5349
AuraEffect * GetAuraEffectDummy(uint32 spellid) const
Definition: Unit.cpp:5550
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty)
Definition: Group.cpp:1753
uint8 GetMemberGroup(ObjectGuid guid) const
Definition: Group.cpp:2380
ObjectGuid GetLooterGuid() const
Definition: Group.cpp:2317
LootMethod GetLootMethod() const
Definition: Group.cpp:2312
void UpdateLooterGuid(WorldObject *pLootedObject, bool ifneed=false)
Definition: Group.cpp:1864
void SendLooter(Creature *creature, Player *pLooter)
Definition: Group.cpp:965
Definition: LootMgr.h:313
bool empty() const
Definition: LootMgr.h:367
bool isLooted() const
Definition: LootMgr.h:368
void clear()
Definition: LootMgr.h:343
void generateMoneyLoot(uint32 minAmount, uint32 maxAmount)
Definition: LootMgr.cpp:837
bool FillLoot(uint32 lootId, LootStore const &store, Player *lootOwner, bool personal, bool noEmptyError=false, uint16 lootMode=LOOT_MODE_DEFAULT, WorldObject *lootSource=nullptr)
Definition: LootMgr.cpp:570
Definition: Map.h:311
bool IsRaidOrHeroicDungeon() const
Definition: Map.h:449
InstanceMap * ToInstanceMap()
Definition: Map.h:544
void PermBindAllPlayers()
Definition: Map.cpp:3155
Definition: OutdoorPvP.h:185

References ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, Creature::AI(), Creature::AllLootRemovedFromCorpse(), Group::BroadcastPacket(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_PRIEST, Loot::clear(), ThreatMgr::ClearAllThreat(), CombatStop(), CONFIG_DURABILITY_LOSS_IN_PVP, CREATURE_FLAG_EXTRA_INSTANCE_BIND, HostileRefMgr::deleteReferences(), DUEL_INTERRUPTED, Loot::empty(), Loot::FillLoot(), ObjectAccessor::FindPlayer(), CreatureTemplate::flags_extra, FREE_FOR_ALL, Loot::generateMoneyLoot(), GetAuraEffectDummy(), Player::GetBattleground(), GetCharmerOrOwnerPlayerOrPlayerItself(), Creature::GetCreatureTemplate(), Object::GetEntry(), Player::GetGroup(), Object::GetGUID(), GetHealth(), getHostileRefMgr(), WorldObject::GetInstanceId(), Group::GetLooterGuid(), Group::GetLootMethod(), Creature::GetLootMode(), Creature::GetLootRecipient(), Creature::GetLootRecipientGroup(), WorldObject::GetMap(), Group::GetMemberGroup(), Player::GetOutdoorPvP(), GetOwner(), GetOwnerGUID(), Player::GetPet(), Player::GetResurrectionSpellId(), Player::GetTeamId(), GetThreatMgr(), Object::GetUInt32Value(), WorldObject::GetZoneId(), HasAura(), Player::HasPlayerFlag(), HasSpiritOfRedemptionAura(), Player::InBattleground(), IsAIEnabled, IsAlive(), IsClass(), Pet::isControlled(), Object::IsCreature(), Creature::IsDamageEnoughForLootingAndReward(), Map::IsDungeon(), WorldObject::IsInMap(), Loot::isLooted(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), Map::IsRaidOrHeroicDungeon(), IsTotem(), CreatureAI::KilledUnit(), LOG_DEBUG, Creature::loot, CreatureTemplate::lootid, LootTemplates_Creature, CreatureTemplate::maxgold, CreatureTemplate::mingold, GroupReference::next(), InstanceMap::PermBindAllPlayers(), PLAYER_FLAGS_IS_OUT_OF_BOUNDS, PLAYER_SELF_RES_SPELL, PROC_EX_NONE, PROC_FLAG_DEATH, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_FLAG_NONE, ProcDamageAndSpell(), RATE_DURABILITY_LOSS_ON_DEATH, RemoveAllAurasOnDeath(), Player::RewardPlayerAndGroupAtKill(), sBattlefieldMgr, Player::SendDirectMessage(), Group::SendLooter(), Player::SendMessageToSet(), setDeathState(), Object::SetDynamicFlag(), Creature::SetLootRecipient(), SetUInt32Value(), SMSG_LOOT_LIST, SMSG_PARTYKILLLOG, sScriptMgr, sWorld, Object::ToCreature(), Map::ToInstanceMap(), Object::ToPlayer(), ToTempSummon(), UNIT_DYNFLAG_LOOTABLE, Player::UpdateAchievementCriteria(), and Group::UpdateLooterGuid().

Referenced by npc_mograine::npc_mograineAI::AshbringerEvent(), boss_headless_horseman_head::DamageTaken(), boss_viscidus::DamageTaken(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), DealDamage(), boss_jedoga_shadowseeker::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_illidan_stormrage::DoAction(), boss_illidari_council::DoAction(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), LichKingDeathEvent::Execute(), DeathEvent::Execute(), AuraEffect::HandleAuraControlVehicle(), BattlegroundIC::HandleCapturedNodes(), misc_commandscript::HandleDieCommand(), spell_ooze_zap_channel_end::HandleDummy(), spell_pos_rimefang_frost_nova::HandleDummy(), spell_q12589_shoot_rjr::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_yogg_saron_titanic_storm::HandleDummyEffect(), spell_item_rocket_chicken::HandleDummyTick(), spell_ulduar_arachnopod_damaged_aura::HandleEffectPeriodic(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_teron_gorefiend_spiritual_vengeance::HandleEffectRemove(), spell_voa_overcharge_aura::HandlePeriodicDummy(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_felmyst_fog_of_corruption_charm_aura::HandleRemove(), spell_leotheras_clear_consuming_madness::HandleScriptEffect(), boss_twin_valkyrAI::JustDied(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_sister_svalna::boss_sister_svalnaAI::JustDied(), boss_ignis::boss_ignisAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), boss_ahune::JustDied(), npc_frozen_core::JustDied(), boss_twinemperorsAI::JustDied(), boss_halion::boss_halionAI::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), KillSelf(), boss_buru::ManipulateEggs(), npc_burning_spirit::npc_burning_spiritAI::MovementInform(), spell_yogg_saron_insane_aura::OnRemove(), WretchedGhoulCleaner::operator()(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::PassengerBoarded(), SmartScript::ProcessAction(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::RandomizeCompositionsAndShow(), boss_faerlina::boss_faerlinaAI::SpellHit(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::Update(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::Update(), instance_shattered_halls::instance_shattered_halls_InstanceMapScript::Update(), SimpleCharmedAI::UpdateAI(), npc_crusade_persuaded::npc_crusade_persuadedAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_sinkhole_kill_credit::npc_sinkhole_kill_creditAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), and npc_emily::npc_emilyAI::WaypointReached().

◆ KillSelf()

void Unit::KillSelf ( bool  durabilityLoss = true,
WeaponAttackType  attackType = BASE_ATTACK,
SpellInfo const *  spellProto = nullptr,
Spell const *  spell = nullptr 
)
inline
1159{ Kill(this, this, durabilityLoss, attackType, spellProto, spell); };

References Kill().

Referenced by boss_felblood_kaelthas::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_illidari_council::DoAction(), npc_xt002_boombot::npc_xt002_boombotAI::Explode(), npc_raging_flames::FixateRandomTarget(), npc_rancid_mushroom::InitializeAI(), boss_warlord_kalithresh::JustDied(), npc_pet_gen_plump_turkey::MovementInform(), npc_wild_wyrm::npc_wild_wyrmAI::MovementInform(), npc_announcer_toc5::npc_announcer_toc5AI::MovementInform(), boss_glob_of_viscidus::MovementInform(), SmartScript::ProcessAction(), npc_singularity::Reset(), boss_archimonde::Reset(), npc_dark_iron_guzzler::SpellHit(), boss_victor_nefarius::boss_victor_nefariusAI::SummonedCreatureDies(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDies(), npc_icc_gauntlet_controller::npc_icc_gauntlet_controllerAI::SummonedCreatureDies(), boss_vazruden_the_herald::SummonedCreatureDies(), npc_warden_mellichar::npc_warden_mellicharAI::SummonedCreatureDies(), npc_brewfest_super_brew_trigger::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and npc_frost_tomb::UpdateAI().

◆ KnockbackFrom()

void Unit::KnockbackFrom ( float  x,
float  y,
float  speedXY,
float  speedZ 
)
19145{
19146 Player* player = ToPlayer();
19147 if (!player)
19148 {
19149 if (Unit* charmer = GetCharmer())
19150 {
19151 player = charmer->ToPlayer();
19152 if (player && player->m_mover != this)
19153 player = nullptr;
19154 }
19155 }
19156
19157 if (!player)
19158 {
19159 GetMotionMaster()->MoveKnockbackFrom(x, y, speedXY, speedZ);
19160 }
19161 else
19162 {
19163 float vcos, vsin;
19164 GetSinCos(x, y, vsin, vcos);
19165
19166 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19167 data << GetPackGUID();
19168 data << uint32(0); // counter
19169 data << float(vcos); // x direction
19170 data << float(vsin); // y direction
19171 data << float(speedXY); // Horizontal speed
19172 data << float(-speedZ); // Z Movement speed (vertical)
19173
19174 player->GetSession()->SendPacket(&data);
19175
19176 if (player->HasIncreaseMountedFlightSpeedAura() || player->HasFlyAura())
19177 player->SetCanFly(true, true);
19178
19179 player->SetCanKnockback(true);
19180 }
19181}
void GetSinCos(float x, float y, float &vsin, float &vcos) const
Definition: Position.cpp:92
SafeUnitPointer m_mover
Definition: Player.h:2316
void SetCanKnockback(bool value)
Definition: Player.h:2483
bool SetCanFly(bool apply, bool packetOnly=false) override
Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pre...
Definition: Player.cpp:15926
bool HasFlyAura() const
Definition: Unit.h:1664
bool HasIncreaseMountedFlightSpeedAura() const
Definition: Unit.h:1691
void MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ)
Definition: MotionMaster.cpp:558

References GetCharmer(), GetMotionMaster(), Object::GetPackGUID(), Player::GetSession(), Position::GetSinCos(), HasFlyAura(), HasIncreaseMountedFlightSpeedAura(), Player::m_mover, MotionMaster::MoveKnockbackFrom(), WorldSession::SendPacket(), Player::SetCanFly(), Player::SetCanKnockback(), SMSG_MOVE_KNOCK_BACK, and Object::ToPlayer().

Referenced by _ExitVehicle(), boss_maexxna::boss_maexxnaAI::DoCastWebWrap(), Spell::EffectKnockBack(), spell_warhead_detonate::HandleDummy(), npc_vekjik::OnGossipSelect(), and npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI().

◆ MagicSpellHitResult()

SpellMissInfo Unit::MagicSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3328{
3329 // Can`t miss on dead target (on skinning for example)
3330 if (!victim->IsAlive() && !victim->IsPlayer())
3331 return SPELL_MISS_NONE;
3332
3333 // vehicles cant miss
3334 if (IsVehicle())
3335 return SPELL_MISS_NONE;
3336
3337 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3338 // resist and deflect chances
3339 // xinef: skip all calculations, proof: Toxic Tolerance quest
3340 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3341 return SPELL_MISS_NONE;
3342
3343 if (spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
3344 {
3345 return SPELL_MISS_NONE;
3346 }
3347
3348 SpellSchoolMask schoolMask = spellInfo->GetSchoolMask();
3349 int32 thisLevel = getLevelForTarget(victim);
3350 if (IsCreature() && ToCreature()->IsTrigger())
3351 thisLevel = std::max<int32>(thisLevel, spellInfo->SpellLevel);
3352 int32 levelDiff = int32(victim->getLevelForTarget(this)) - thisLevel;
3353
3354 int32 MISS_CHANCE_MULTIPLIER;
3355 if (sWorld->getBoolConfig(CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS) && !IsPlayer()) // keep it as it was originally (7 and 11)
3356 {
3357 MISS_CHANCE_MULTIPLIER = victim->IsPlayer() ? 7 : 11;
3358 }
3359 else
3360 {
3361 MISS_CHANCE_MULTIPLIER = sWorld->getRate(
3362 victim->IsPlayer()
3365 }
3366
3367 // Base hit chance from attacker and victim levels
3368 int32 modHitChance = levelDiff < 3
3369 ? 96 - levelDiff
3370 : 94 - (levelDiff - 2) * MISS_CHANCE_MULTIPLIER;
3371
3372 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
3373 if (Player* modOwner = GetSpellModOwner())
3374 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_RESIST_MISS_CHANCE, modHitChance);
3375
3376 // Increase from attacker SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT auras
3378
3379 // Spells with SPELL_ATTR3_ALWAYS_HIT will ignore target's avoidance effects
3380 // xinef: imo it should completly ignore all calculations, eg: 14792. Hits 80 level players on blizz without any problems
3381 //if (!spell->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3382 {
3383 // Chance hit from victim SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE auras
3385 // Reduce spell hit chance for Area of effect spells from victim SPELL_AURA_MOD_AOE_AVOIDANCE aura
3386 if (spellInfo->IsAffectingArea())
3387 modHitChance -= victim->GetTotalAuraModifier(SPELL_AURA_MOD_AOE_AVOIDANCE);
3388
3389 // Decrease hit chance from victim rating bonus
3390 if (victim->IsPlayer())
3391 modHitChance -= int32(victim->ToPlayer()->GetRatingBonusValue(CR_HIT_TAKEN_SPELL));
3392 }
3393
3394 int32 HitChance = modHitChance * 100;
3395 // Increase hit chance from attacker SPELL_AURA_MOD_SPELL_HIT_CHANCE and attacker ratings
3396 // Xinef: Totems should inherit casters ratings?
3397 if (IsTotem())
3398 {
3399 if (Unit* owner = GetOwner())
3400 HitChance += int32(owner->m_modSpellHitChance * 100.0f);
3401 }
3402 else
3403 HitChance += int32(m_modSpellHitChance * 100.0f);
3404
3405 if (HitChance < 100)
3406 HitChance = 100;
3407 else if (HitChance > 10000)
3408 HitChance = 10000;
3409
3410 int32 tmp = 10000 - HitChance;
3411
3412 int32 rand = irand(1, 10000); // Needs to be 1 to 10000 to avoid the 1/10000 chance to miss on 100% hit rating
3413
3414 if (rand < tmp)
3415 return SPELL_MISS_MISS;
3416
3417 // Chance resist mechanic (select max value from every mechanic spell effect)
3418 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3419 tmp += resist_chance;
3420
3421 // Chance resist debuff
3422 if (!spellInfo->IsPositive() && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))
3423 {
3424 bool bNegativeAura = true;
3425 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3426 {
3427 // Xinef: Check if effect exists!
3428 if (spellInfo->Effects[i].IsEffect() && spellInfo->Effects[i].ApplyAuraName == 0)
3429 {
3430 bNegativeAura = false;
3431 break;
3432 }
3433 }
3434
3435 if (bNegativeAura)
3436 {
3437 tmp += victim->GetMaxPositiveAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3438 tmp += victim->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3439 }
3440
3441 // Players resistance for binary spells
3442 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && (spellInfo->GetSchoolMask() & (SPELL_SCHOOL_MASK_NORMAL | SPELL_SCHOOL_MASK_HOLY)) == 0)
3443 tmp += int32(Unit::GetEffectiveResistChance(this, spellInfo->GetSchoolMask(), victim) * 10000.0f); // 100 for spell calculations, and 100 for return value percentage
3444 }
3445
3446 // Roll chance
3447 if (rand < tmp)
3448 return SPELL_MISS_RESIST;
3449
3450 // cast by caster in front of victim
3451 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasIgnoreHitDirectionAura()))
3452 {
3453 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3454 tmp += deflect_chance;
3455 if (rand < tmp)
3456 return SPELL_MISS_DEFLECT;
3457 }
3458
3459 return SPELL_MISS_NONE;
3460}
@ SPELL_ATTR7_NO_ATTACK_MISS
Definition: SharedDefines.h:666
@ SPELL_MISS_NONE
Definition: SharedDefines.h:1519
@ SPELL_MISS_RESIST
Definition: SharedDefines.h:1521
@ SPELL_MISS_MISS
Definition: SharedDefines.h:1520
@ SPELL_MISS_DEFLECT
Definition: SharedDefines.h:1528
@ SPELLMOD_RESIST_MISS_CHANCE
Definition: SpellDefines.h:92
@ SPELL_AURA_MOD_DEBUFF_RESISTANCE
Definition: SpellAuraDefines.h:241
@ SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT
Definition: SpellAuraDefines.h:262
@ SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE
Definition: SpellAuraDefines.h:249
@ SPELL_AURA_MOD_AOE_AVOIDANCE
Definition: SpellAuraDefines.h:223
@ CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS
Definition: IWorld.h:173
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER
Definition: IWorld.h:519
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE
Definition: IWorld.h:518
@ CR_HIT_TAKEN_SPELL
Definition: Unit.h:230
float GetRatingBonusValue(CombatRating cr) const
Definition: Player.cpp:5194
int32 GetMaxNegativeAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:6052
int32 GetMaxPositiveAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:6038
int32 GetMechanicResistChance(SpellInfo const *spell)
Definition: Unit.cpp:3133

References CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS, CR_HIT_TAKEN_SPELL, SpellInfo::Dispel, SpellInfo::Effects, GetEffectiveResistChance(), getLevelForTarget(), GetMaxNegativeAuraModifierByMiscValue(), GetMaxPositiveAuraModifierByMiscValue(), GetMechanicResistChance(), GetOwner(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, irand(), SpellInfo::IsAffectingArea(), IsAlive(), Object::IsCreature(), Object::IsPlayer(), SpellInfo::IsPositive(), IsTotem(), IsVehicle(), m_modSpellHitChance, MAX_SPELL_EFFECTS, RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE, RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER, SPELL_ATTR0_CU_BINARY_SPELL, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR4_NO_CAST_LOG, SPELL_ATTR7_NO_ATTACK_MISS, SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_MOD_AOE_AVOIDANCE, SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE, SPELL_AURA_MOD_DEBUFF_RESISTANCE, SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT, SPELL_MISS_DEFLECT, SPELL_MISS_MISS, SPELL_MISS_NONE, SPELL_MISS_RESIST, SPELL_SCHOOL_MASK_HOLY, SPELL_SCHOOL_MASK_NORMAL, SpellInfo::SpellLevel, SPELLMOD_RESIST_MISS_CHANCE, sWorld, Object::ToCreature(), Object::ToPlayer(), and UNIT_STATE_STUNNED.

Referenced by SpellHitResult().

◆ MeleeDamageBonusDone()

uint32 Unit::MeleeDamageBonusDone ( Unit pVictim,
uint32  damage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
13075{
13076 if (!victim || pdamage == 0)
13077 return 0;
13078
13079 if (IsCreature())
13080 {
13081 // Dancing Rune Weapon...
13082 if (GetEntry() == 27893)
13083 {
13084 if (Unit* owner = GetOwner())
13085 return owner->MeleeDamageBonusDone(victim, pdamage, attType, spellProto, damageSchoolMask) / 2;
13086 }
13087 }
13088
13089 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
13090
13091 // Done fixed damage bonus auras
13092 int32 DoneFlatBenefit = 0;
13093
13094 // ..done
13096 for (AuraEffectList::const_iterator i = mDamageDoneCreature.begin(); i != mDamageDoneCreature.end(); ++i)
13097 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13098 DoneFlatBenefit += (*i)->GetAmount();
13099
13100 // ..done
13101 // SPELL_AURA_MOD_DAMAGE_DONE included in weapon damage
13102
13103 // ..done (base at attack power for marked target and base at attack power for creature type)
13104 int32 APbonus = 0;
13105
13106 if (attType == RANGED_ATTACK)
13107 {
13108 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
13109
13110 // ..done (base at attack power and creature type)
13112 for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i)
13113 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13114 APbonus += (*i)->GetAmount();
13115 }
13116 else
13117 {
13118 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
13119
13120 // ..done (base at attack power and creature type)
13122 for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i)
13123 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13124 APbonus += (*i)->GetAmount();
13125 }
13126
13127 if (APbonus != 0) // Can be negative
13128 {
13129 bool normalized = false;
13130 if (spellProto)
13131 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
13132 if (spellProto->Effects[i].Effect == SPELL_EFFECT_NORMALIZED_WEAPON_DMG)
13133 {
13134 normalized = true;
13135 break;
13136 }
13137 DoneFlatBenefit += int32(APbonus / 14.0f * GetAPMultiplier(attType, normalized));
13138 }
13139
13140 // Done total percent damage auras
13141 float DoneTotalMod = 1.0f;
13142
13143 // mods for SPELL_SCHOOL_MASK_NORMAL are already factored in base melee damage calculation
13144 if (!(damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL))
13145 {
13146 // Some spells don't benefit from pct done mods
13148 for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
13149 {
13150 if (!spellProto || (spellProto->ValidateAttribute6SpellDamageMods(this, *i, false) &&
13151 sScriptMgr->IsNeedModMeleeDamagePercent(this, *i, DoneTotalMod, spellProto)))
13152 {
13153 if (((*i)->GetMiscValue() & damageSchoolMask))
13154 {
13155 if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
13156 AddPct(DoneTotalMod, (*i)->GetAmount());
13157 else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
13158 AddPct(DoneTotalMod, (*i)->GetAmount());
13159 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
13160 AddPct(DoneTotalMod, (*i)->GetAmount());
13161 }
13162 }
13163 }
13164 }
13165
13167 for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
13168 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13169 if (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13170 AddPct(DoneTotalMod, (*i)->GetAmount());
13171
13172 // bonus against aurastate
13174 for (AuraEffectList::const_iterator i = mDamageDoneVersusAurastate.begin(); i != mDamageDoneVersusAurastate.end(); ++i)
13175 if (victim->HasAuraState(AuraStateType((*i)->GetMiscValue())))
13176 if (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13177 AddPct(DoneTotalMod, (*i)->GetAmount());
13178
13179 // done scripted mod (take it from owner)
13180 Unit* owner = GetOwner() ? GetOwner() : this;
13181 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13182 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
13183 {
13184 if (spellProto && !spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13185 continue;
13186
13187 if (!(*i)->IsAffectedOnSpell(spellProto))
13188 continue;
13189
13190 switch ((*i)->GetMiscValue())
13191 {
13192 // Tundra Stalker
13193 // Merciless Combat
13194 case 7277:
13195 {
13196 // Merciless Combat
13197 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
13198 {
13199 if (!victim->HealthAbovePct(35))
13200 AddPct(DoneTotalMod, (*i)->GetAmount());
13201 }
13202 // Tundra Stalker
13203 else
13204 {
13205 // Frost Fever (target debuff)
13206 if (victim->HasAura(55095))
13207 AddPct(DoneTotalMod, (*i)->GetAmount());
13208 }
13209 break;
13210 }
13211 // Rage of Rivendare
13212 case 7293:
13213 {
13214 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0x02000000, 0))
13215 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
13216 break;
13217 }
13218 // Marked for Death
13219 case 7598:
13220 case 7599:
13221 case 7600:
13222 case 7601:
13223 case 7602:
13224 {
13225 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
13226 AddPct(DoneTotalMod, (*i)->GetAmount());
13227 break;
13228 }
13229 // Dirty Deeds
13230 case 6427:
13231 case 6428:
13232 {
13233 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
13234 {
13235 // effect 0 has expected value but in negative state
13236 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
13237 AddPct(DoneTotalMod, bonus);
13238 }
13239 break;
13240 }
13241 }
13242 }
13243
13244 // Custom scripted damage
13245 if (spellProto)
13246 switch (spellProto->SpellFamilyName)
13247 {
13249 // Glacier Rot
13250 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
13252 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
13253 AddPct(DoneTotalMod, aurEff->GetAmount());
13254 break;
13255 }
13256
13257 // Some spells don't benefit from done mods
13258 if (spellProto)
13259 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
13260 {
13261 DoneFlatBenefit = 0;
13262 DoneTotalMod = 1.0f;
13263 }
13264
13265 float tmpDamage = float(int32(pdamage) + DoneFlatBenefit) * DoneTotalMod;
13266
13267 // apply spellmod to Done damage
13268 if (spellProto)
13269 if (Player* modOwner = GetSpellModOwner())
13270 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_DAMAGE, tmpDamage);
13271
13272 // bonus result can be negative
13273 return uint32(std::max(tmpDamage, 0.0f));
13274}
@ SPELL_EFFECT_NORMALIZED_WEAPON_DMG
Definition: SharedDefines.h:899
@ SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM
Definition: SharedDefines.h:583
@ SPELL_ATTR3_IGNORE_CASTER_MODIFIERS
Definition: SharedDefines.h:522
@ SPELLMOD_DAMAGE
Definition: SpellDefines.h:76
@ SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS
Definition: SpellAuraDefines.h:165
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS
Definition: SpellAuraDefines.h:231
@ SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS
Definition: SpellAuraDefines.h:194
@ SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
Definition: SpellAuraDefines.h:142
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE
Definition: SpellAuraDefines.h:366
@ SPELL_AURA_MOD_DAMAGE_DONE_CREATURE
Definition: SpellAuraDefines.h:122
float GetAPMultiplier(WeaponAttackType attType, bool normalized)
Definition: Unit.cpp:17219
AuraEffect * GetDummyAuraEffect(SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
Definition: Unit.h:1358

References AddPct(), AURA_STATE_HEALTHLESS_35_PERCENT, SpellInfo::Effects, GetAPMultiplier(), GetAuraEffect(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDiseasesByCaster(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetOwner(), GetSpellModOwner(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HealthAbovePct(), SpellInfo::Id, Object::IsCreature(), MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_MOD_DAMAGE_DONE_CREATURE, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS, SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS, SPELL_AURA_MOD_STALKED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELL_EFFECT_NORMALIZED_WEAPON_DMG, SPELL_SCHOOL_MASK_NORMAL, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_HUNTER, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_DAMAGE, sScriptMgr, Object::ToPlayer(), and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ MeleeDamageBonusTaken()

uint32 Unit::MeleeDamageBonusTaken ( Unit attacker,
uint32  pdamage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
13277{
13278 if (pdamage == 0)
13279 return 0;
13280
13281 int32 TakenFlatBenefit = 0;
13282
13283 // ..taken
13285 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
13286 if ((*i)->GetMiscValue() & damageSchoolMask)
13287 TakenFlatBenefit += (*i)->GetAmount();
13288
13289 if (attType != RANGED_ATTACK)
13291 else
13293
13294 // Taken total percent damage auras
13295 float TakenTotalMod = 1.0f;
13296
13298
13299 // .. taken pct (special attacks)
13300 if (spellProto)
13301 {
13302 // From caster spells
13304 for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
13305 if ((*i)->GetCasterGUID() == attacker->GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
13306 AddPct(TakenTotalMod, (*i)->GetAmount());
13307
13308 // Mod damage from spell mechanic
13309 uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask();
13310
13311 // Shred, Maul - "Effects which increase Bleed damage also increase Shred damage"
13312 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[0] & 0x00008800)
13313 mechanicMask |= (1 << MECHANIC_BLEED);
13314
13315 if (mechanicMask)
13316 {
13318 for (AuraEffectList::const_iterator i = mDamageDoneMechanic.begin(); i != mDamageDoneMechanic.end(); ++i)
13319 if (mechanicMask & uint32(1 << ((*i)->GetMiscValue())))
13320 AddPct(TakenTotalMod, (*i)->GetAmount());
13321 }
13322 }
13323
13324 TakenTotalMod = processDummyAuras(TakenTotalMod);
13325
13326 // .. taken pct: class scripts
13327 /*AuraEffectList const& mclassScritAuras = GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13328 for (AuraEffectList::const_iterator i = mclassScritAuras.begin(); i != mclassScritAuras.end(); ++i)
13329 {
13330 switch ((*i)->GetMiscValue())
13331 {
13332 }
13333 }*/
13334
13335 if (attType != RANGED_ATTACK)
13336 {
13338 for (AuraEffectList::const_iterator i = mModMeleeDamageTakenPercent.begin(); i != mModMeleeDamageTakenPercent.end(); ++i)
13339 AddPct(TakenTotalMod, (*i)->GetAmount());
13340 }
13341 else
13342 {
13343 AuraEffectList const& mModRangedDamageTakenPercent = GetAuraEffectsByType(SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT);
13344 for (AuraEffectList::const_iterator i = mModRangedDamageTakenPercent.begin(); i != mModRangedDamageTakenPercent.end(); ++i)
13345 AddPct(TakenTotalMod, (*i)->GetAmount());
13346 }
13347
13348 // No positive taken bonus, custom attr
13349 if (spellProto)
13350 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
13351 {
13352 TakenFlatBenefit = 0;
13353 TakenTotalMod = 1.0f;
13354 }
13355
13356 // xinef: sanctified wrath talent
13357 if (TakenTotalMod < 1.0f && attacker->HasIgnoreTargetResistAura())
13358 {
13359 float ignoreModifier = 1.0f - TakenTotalMod;
13360 bool addModifier = false;
13362 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
13363 if ((*j)->GetMiscValue() & damageSchoolMask)
13364 {
13365 ApplyPct(ignoreModifier, (*j)->GetAmount());
13366 addModifier = true;
13367 }
13368
13369 if (addModifier)
13370 TakenTotalMod += ignoreModifier;
13371 }
13372
13373 float tmpDamage = (float(pdamage) + TakenFlatBenefit) * TakenTotalMod;
13374
13375 // bonus result can be negative
13376 return uint32(std::max(tmpDamage, 0.0f));
13377}
@ SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS
Definition: SpellInfo.h:197
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN
Definition: SpellAuraDefines.h:176
@ SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
Definition: SpellAuraDefines.h:150
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN
Definition: SpellAuraDefines.h:188
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT
Definition: SpellAuraDefines.h:189
@ SPELL_AURA_MOD_DAMAGE_TAKEN
Definition: SpellAuraDefines.h:77
@ SPELL_AURA_MOD_DAMAGE_FROM_CASTER
Definition: SpellAuraDefines.h:334
@ SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT
Definition: SpellAuraDefines.h:318
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT
Definition: SpellAuraDefines.h:177
float processDummyAuras(float TakenTotalMod) const
Definition: Unit.cpp:11902
bool HasIgnoreTargetResistAura() const
Definition: Unit.h:1689

References AddPct(), ApplyPct(), SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), Object::GetGUID(), GetTotalAuraModifier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::HasAttribute(), HasIgnoreTargetResistAura(), MECHANIC_BLEED, processDummyAuras(), RANGED_ATTACK, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_DAMAGE_TAKEN, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN, SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT, SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN, SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ MeleeSpellHitResult()

SpellMissInfo Unit::MeleeSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3155{
3156 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3157 // resist and deflect chances
3158 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3159 return SPELL_MISS_NONE;
3160
3161 WeaponAttackType attType = BASE_ATTACK;
3162
3163 // Check damage class instead of attack type to correctly handle judgements
3164 // - they are meele, but can't be dodged/parried/deflected because of ranged dmg class
3165 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED)
3166 attType = RANGED_ATTACK;
3167
3168 int32 attackerWeaponSkill;
3169 // skill value for these spells (for example judgements) is 5* level
3170 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED && !spellInfo->IsRangedWeaponSpell())
3171 attackerWeaponSkill = GetLevel() * 5;
3172 // bonus from skills is 0.04% per skill Diff
3173 else
3174 attackerWeaponSkill = int32(GetWeaponSkillValue(attType, victim));
3175
3176 int32 skillDiff = attackerWeaponSkill - int32(victim->GetMaxSkillValueForLevel(this));
3177
3178 uint32 roll = urand (0, 10000);
3179
3180 uint32 missChance = uint32(MeleeSpellMissChance(victim, attType, skillDiff, spellInfo->Id) * 100.0f);
3181 // Roll miss
3182 uint32 tmp = missChance;
3183 if (roll < tmp)
3184 return SPELL_MISS_MISS;
3185
3186 bool canDodge = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_DODGE);
3187 bool canParry = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_PARRY);
3188 bool canBlock = spellInfo->HasAttribute(SPELL_ATTR3_COMPLETELY_BLOCKED) && !spellInfo->HasAttribute(SPELL_ATTR0_CU_DIRECT_DAMAGE);
3189
3190 // Same spells cannot be parry/dodge
3191 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3192 return SPELL_MISS_NONE;
3193
3194 // Chance resist mechanic
3195 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3196 tmp += resist_chance;
3197 if (roll < tmp)
3198 return SPELL_MISS_RESIST;
3199
3200 // Ranged attacks can only miss, resist and deflect
3201 if (attType == RANGED_ATTACK)
3202 {
3203 // only if in front
3204 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasIgnoreHitDirectionAura()))
3205 {
3206 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3207 tmp += deflect_chance;
3208 if (roll < tmp)
3209 return SPELL_MISS_DEFLECT;
3210 }
3211
3212 canDodge = false;
3213 canParry = false;
3214 }
3215
3216 // Check for attack from behind
3217 // xinef: if from behind or spell requires cast from behind
3218 if (!victim->HasInArc(M_PI, this))
3219 {
3220 if (!victim->HasIgnoreHitDirectionAura() || spellInfo->HasAttribute(SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET))
3221 {
3222 // Can`t dodge from behind in PvP (but its possible in PvE)
3223 if (victim->IsPlayer())
3224 {
3225 canDodge = false;
3226 }
3227
3228 // Can`t parry or block
3229 canParry = false;
3230 canBlock = false;
3231 }
3232 }
3233
3234 // Check creatures flags_extra for disable parry
3235 if (victim->IsCreature())
3236 {
3237 uint32 flagEx = victim->ToCreature()->GetCreatureTemplate()->flags_extra;
3238 // Xinef: no dodge flag
3239 if (flagEx & CREATURE_FLAG_EXTRA_NO_DODGE)
3240 canDodge = false;
3241 if (flagEx & CREATURE_FLAG_EXTRA_NO_PARRY)
3242 canParry = false;
3243 // Check creatures flags_extra for disable block
3244 if (flagEx & CREATURE_FLAG_EXTRA_NO_BLOCK)
3245 canBlock = false;
3246 }
3247 // Ignore combat result aura
3249 for (AuraEffectList::const_iterator i = ignore.begin(); i != ignore.end(); ++i)
3250 {
3251 if (!(*i)->IsAffectedOnSpell(spellInfo))
3252 continue;
3253 switch ((*i)->GetMiscValue())
3254 {
3255 case MELEE_HIT_DODGE:
3256 canDodge = false;
3257 break;
3258 case MELEE_HIT_BLOCK:
3259 canBlock = false;
3260 break;
3261 case MELEE_HIT_PARRY:
3262 canParry = false;
3263 break;
3264 default:
3265 LOG_DEBUG("entities.unit", "Spell {} SPELL_AURA_IGNORE_COMBAT_RESULT has unhandled state {}", (*i)->GetId(), (*i)->GetMiscValue());
3266 break;
3267 }
3268 }
3269
3270 if (canDodge)
3271 {
3272 // Roll dodge
3273 int32 dodgeChance = int32(victim->GetUnitDodgeChance() * 100.0f) - skillDiff * 4;
3274 // Reduce enemy dodge chance by SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
3276 dodgeChance = int32(float(dodgeChance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
3277 // Reduce dodge chance by attacker expertise rating
3278 if (IsPlayer())
3279 dodgeChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3280 else
3282
3283 // xinef: cant dodge while casting or while stunned
3284 if (dodgeChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3285 dodgeChance = 0;
3286
3287 tmp += dodgeChance;
3288 if (roll < tmp)
3289 return SPELL_MISS_DODGE;
3290 }
3291
3292 if (canParry)
3293 {
3294 // Roll parry
3295 int32 parryChance = int32(victim->GetUnitParryChance() * 100.0f) - skillDiff * 4;
3296 // Reduce parry chance by attacker expertise rating
3297 if (IsPlayer())
3298 parryChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3299 else
3301
3302 // xinef: cant parry while casting or while stunned
3303 if (parryChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3304 parryChance = 0;
3305
3306 tmp += parryChance;
3307 if (roll < tmp)
3308 return SPELL_MISS_PARRY;
3309 }
3310
3311 if (canBlock)
3312 {
3313 int32 blockChance = int32(victim->GetUnitBlockChance() * 100.0f) - skillDiff * 4;
3314
3315 // xinef: cant block while casting or while stunned
3316 if (blockChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3317 blockChance = 0;
3318
3319 tmp += blockChance;
3320 if (roll < tmp)
3321 return SPELL_MISS_BLOCK;
3322 }
3323
3324 return SPELL_MISS_NONE;
3325}
@ SPELL_ATTR7_NO_ATTACK_PARRY
Definition: SharedDefines.h:665
@ SPELL_ATTR7_NO_ATTACK_DODGE
Definition: SharedDefines.h:664
@ SPELL_ATTR3_COMPLETELY_BLOCKED
Definition: SharedDefines.h:496
@ SPELL_MISS_PARRY
Definition: SharedDefines.h:1523
@ SPELL_MISS_DODGE
Definition: SharedDefines.h:1522
@ SPELL_MISS_BLOCK
Definition: SharedDefines.h:1524
@ SPELL_ATTR0_CU_DIRECT_DAMAGE
Definition: SpellInfo.h:184
@ SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET
Definition: SpellInfo.h:193
@ SPELL_AURA_MOD_EXPERTISE
Definition: SpellAuraDefines.h:303
@ SPELL_AURA_IGNORE_COMBAT_RESULT
Definition: SpellAuraDefines.h:265
@ SPELL_AURA_MOD_ENEMY_DODGE
Definition: SpellAuraDefines.h:314
@ SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
Definition: SpellAuraDefines.h:311
@ CREATURE_FLAG_EXTRA_NO_PARRY
Definition: CreatureData.h:47
@ CREATURE_FLAG_EXTRA_NO_DODGE
Definition: CreatureData.h:68
float GetUnitDodgeChance() const
Definition: Unit.cpp:3640
float GetTotalAuraMultiplier(AuraType auratype) const
Definition: Unit.cpp:5924
float GetUnitParryChance() const
Definition: Unit.cpp:3657
float MeleeSpellMissChance(Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
Definition: Unit.cpp:18989

References BASE_ATTACK, CREATURE_FLAG_EXTRA_NO_BLOCK, CREATURE_FLAG_EXTRA_NO_DODGE, CREATURE_FLAG_EXTRA_NO_PARRY, SpellInfo::DmgClass, CreatureTemplate::flags_extra, GetAuraEffectsByType(), Creature::GetCreatureTemplate(), GetLevel(), GetMaxSkillValueForLevel(), GetMechanicResistChance(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetUnitBlockChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, Object::IsCreature(), IsNonMeleeSpellCast(), Object::IsPlayer(), SpellInfo::IsRangedWeaponSpell(), LOG_DEBUG, MELEE_HIT_BLOCK, MELEE_HIT_DODGE, MELEE_HIT_PARRY, MeleeSpellMissChance(), RANGED_ATTACK, SPELL_ATTR0_CU_DIRECT_DAMAGE, SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET, SPELL_ATTR0_NO_ACTIVE_DEFENSE, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR3_COMPLETELY_BLOCKED, SPELL_ATTR7_NO_ATTACK_DODGE, SPELL_ATTR7_NO_ATTACK_PARRY, SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_IGNORE_COMBAT_RESULT, SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, SPELL_DAMAGE_CLASS_RANGED, SPELL_MISS_BLOCK, SPELL_MISS_DEFLECT, SPELL_MISS_DODGE, SPELL_MISS_MISS, SPELL_MISS_NONE, SPELL_MISS_PARRY, SPELL_MISS_RESIST, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONTROLLED, UNIT_STATE_STUNNED, urand(), and VICTIMSTATE_DODGE.

Referenced by SpellHitResult().

◆ MeleeSpellMissChance()

float Unit::MeleeSpellMissChance ( Unit const *  victim,
WeaponAttackType  attType,
int32  skillDiff,
uint32  spellId 
) const
18990{
18991 SpellInfo const* spellInfo = spellId ? sSpellMgr->GetSpellInfo(spellId) : nullptr;
18992 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
18993 {
18994 return 0.0f;
18995 }
18996
18997 //calculate miss chance
18998 float missChance = victim->GetUnitMissChance(attType);
18999
19000 // Check if dual wielding, add additional miss penalty - when mainhand has on next swing spell, offhand doesnt suffer penalty
19001 if (!spellId && (attType != RANGED_ATTACK) && HasOffhandWeaponForAttack() && (!m_currentSpells[CURRENT_MELEE_SPELL] || !m_currentSpells[CURRENT_MELEE_SPELL]->IsNextMeleeSwingSpell()))
19002 {
19003 missChance += 19;
19004 }
19005
19006 // bonus from skills is 0.04%
19007 //miss_chance -= skillDiff * 0.04f;
19008 int32 diff = -skillDiff;
19009 if (victim->IsPlayer())
19010 missChance += diff > 0 ? diff * 0.04f : diff * 0.02f;
19011 else
19012 missChance += diff > 10 ? 1 + (diff - 10) * 0.4f : diff * 0.1f;
19013
19014 // Calculate hit chance
19015 float hitChance = 100.0f;
19016
19017 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
19018 if (spellId)
19019 {
19020 if (Player* modOwner = GetSpellModOwner())
19021 modOwner->ApplySpellMod(spellId, SPELLMOD_RESIST_MISS_CHANCE, hitChance);
19022 }
19023
19024 missChance -= hitChance - 100.0f;
19025
19026 if (attType == RANGED_ATTACK)
19027 missChance -= m_modRangedHitChance;
19028 else
19029 missChance -= m_modMeleeHitChance;
19030
19031 // Limit miss chance from 0 to 60%
19032 if (missChance < 0.0f)
19033 return 0.0f;
19034 if (missChance > 60.0f)
19035 return 60.0f;
19036 return missChance;
19037}

References CURRENT_MELEE_SPELL, GetSpellModOwner(), GetUnitMissChance(), SpellInfo::HasAttribute(), HasOffhandWeaponForAttack(), Object::IsPlayer(), m_currentSpells, m_modMeleeHitChance, m_modRangedHitChance, RANGED_ATTACK, SPELL_ATTR7_NO_ATTACK_MISS, SPELLMOD_RESIST_MISS_CHANCE, and sSpellMgr.

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ ModifyAuraState()

void Unit::ModifyAuraState ( AuraStateType  flag,
bool  apply 
)
10498{
10499 if (apply)
10500 {
10501 if (!HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10502 {
10503 SetFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10504 Unit::AuraMap& tAuras = GetOwnedAuras();
10505 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10506 {
10507 if ((*itr).second->IsRemoved())
10508 continue;
10509
10510 if ((*itr).second->GetSpellInfo()->CasterAuraState == flag )
10511 if (AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()))
10512 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, true);
10513 }
10514 }
10515 }
10516 else
10517 {
10518 if (HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10519 {
10520 RemoveFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10521
10522 if (flag != AURA_STATE_ENRAGE) // enrage aura state triggering continues auras
10523 {
10524 Unit::AuraMap& tAuras = GetOwnedAuras();
10525 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10526 {
10527 if ((*itr).second->GetSpellInfo()->CasterAuraState == flag )
10528 if (AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()))
10529 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, false);
10530 }
10531 }
10532 }
10533 }
10534}
@ AURA_STATE_ENRAGE
Definition: SharedDefines.h:1309
@ AURA_EFFECT_HANDLE_REAL
Definition: SpellAuraDefines.h:42
void SetFlag(uint16 index, uint32 newFlag)
Definition: Object.cpp:845
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition: Object.cpp:860
std::multimap< uint32, Aura * > AuraMap
Definition: Unit.h:635
AuraMap & GetOwnedAuras()
Definition: Unit.h:1294

References AURA_EFFECT_HANDLE_REAL, AURA_STATE_ENRAGE, Object::GetGUID(), GetOwnedAuras(), Object::HasFlag(), Object::RemoveFlag(), Object::SetFlag(), and UNIT_FIELD_AURASTATE.

Referenced by _ApplyAura(), _UnapplyAura(), ClearAllReactives(), Spell::finish(), debug_commandscript::HandleDebugSetAuraStateCommand(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), ProcDamageAndSpellFor(), Update(), and UpdateReactives().

◆ ModifyHealth()

int32 Unit::ModifyHealth ( int32  val)
14092{
14093 int32 gain = 0;
14094
14095 if (dVal == 0)
14096 return 0;
14097
14098 int32 curHealth = (int32)GetHealth();
14099
14100 int32 val = dVal + curHealth;
14101 if (val <= 0)
14102 {
14103 SetHealth(0);
14104 return -curHealth;
14105 }
14106
14107 int32 maxHealth = (int32)GetMaxHealth();
14108
14109 if (val < maxHealth)
14110 {
14111 SetHealth(val);
14112 gain = val - curHealth;
14113 }
14114 else if (curHealth != maxHealth)
14115 {
14116 SetHealth(maxHealth);
14117 gain = maxHealth - curHealth;
14118 }
14119
14120 return gain;
14121}

References GetHealth(), GetMaxHealth(), and SetHealth().

Referenced by DealDamage(), DealHeal(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), boss_hadronox::boss_hadronoxAI::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), Creature::RegenerateHealth(), Player::RegenerateHealth(), npc_injured_patient::npc_injured_patientAI::Reset(), Spell::TakePower(), Aura::Update(), and npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI().

◆ ModifyPower()

int32 Unit::ModifyPower ( Powers  power,
int32  val,
bool  withPowerUpdate = true 
)
14150{
14151 if (dVal == 0)
14152 return 0;
14153
14154 int32 gain = 0;
14155
14156 int32 curPower = (int32)GetPower(power);
14157
14158 int32 val = dVal + curPower;
14159 if (val <= 0)
14160 {
14161 SetPower(power, 0, withPowerUpdate);
14162 return -curPower;
14163 }
14164
14165 int32 maxPower = (int32)GetMaxPower(power);
14166
14167 if (val < maxPower)
14168 {
14169 SetPower(power, val, withPowerUpdate);
14170 gain = val - curPower;
14171 }
14172 else if (curPower != maxPower)
14173 {
14174 SetPower(power, maxPower, withPowerUpdate);
14175 gain = maxPower - curPower;
14176 }
14177
14178 if (GetAI())
14179 {
14180 GetAI()->OnPowerUpdate(power, gain, dVal, curPower);
14181 }
14182
14183 return gain;
14184}
virtual void OnPowerUpdate(Powers, int32, int32, uint32)
Called when the creature power updates.
Definition: UnitAI.h:375
void SetPower(Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
Definition: Unit.cpp:15566

References GetAI(), GetMaxPower(), GetPower(), UnitAI::OnPowerUpdate(), and SetPower().

Referenced by CalcAbsorbResist(), spell_igb_cannon_blast::CalculatePower(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), EnergizeBySpell(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_kelthuzad_detonate_mana_aura::HandleScript(), boss_pathaleon_the_calculator::JustEngagedWith(), boss_curator::JustEngagedWith(), Pet::LoseHappiness(), ModifyPowerPct(), Creature::Regenerate(), RewardRage(), Pet::setDeathState(), Spell::TakePower(), Spell::TakeRunePower(), Aura::Update(), and boss_faction_championsAI::UpdateAI().

◆ ModifyPowerPct()

int32 Unit::ModifyPowerPct ( Powers  power,
float  pct,
bool  apply = true 
)
14188{
14189 float amount = (float)GetMaxPower(power);
14190 ApplyPercentModFloatVar(amount, pct, apply);
14191
14192 return ModifyPower(power, (int32)amount - (int32)GetMaxPower(power));
14193}

References ApplyPercentModFloatVar(), GetMaxPower(), and ModifyPower().

Referenced by AuraEffect::HandleAuraModIncreaseEnergyPercent().

◆ ModifyRedirectThreat()

void Unit::ModifyRedirectThreat ( int32  amount)
inline
void ModifyThreatPct(int32 amount)
Definition: ThreatMgr.h:307

References _redirectThreatInfo, and RedirectThreatInfo::ModifyThreatPct().

Referenced by spell_warr_vigilance::HandleAfterApply().

◆ ModSpellCastTime()

void Unit::ModSpellCastTime ( SpellInfo const *  spellProto,
int32 castTime,
Spell spell = nullptr 
)
Todo:
:(MadAgos) Eventually check and delete the bool argument
14974{
14975 if (!spellInfo || castTime < 0)
14976 return;
14977
14978 if (spellInfo->IsChanneled() && spellInfo->HasAura(SPELL_AURA_MOUNTED))
14979 return;
14980
14981 // called from caster
14982 if (Player* modOwner = GetSpellModOwner())
14984 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, castTime, spell, bool(modOwner != this && !IsPet()));
14985
14986 switch (spellInfo->DmgClass)
14987 {
14989 if (spellInfo->AttributesEx5 & SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC) // required double check
14990 castTime = int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
14991 else if (spellInfo->SpellVisual[0] == 3881 && HasAura(67556)) // cooking with Chef Hat.
14992 castTime = 500;
14993 break;
14995 break; // no known cases
14997 castTime = CanInstantCast() ? 0 : int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
14998 break;
15000 castTime = int32(float(castTime) * m_modAttackSpeedPct[RANGED_ATTACK]);
15001 break;
15002 default:
15003 break;
15004 }
15005}
@ SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC
Definition: SharedDefines.h:580
@ SPELLMOD_CASTING_TIME
Definition: SpellDefines.h:86
bool CanInstantCast() const
Definition: Unit.h:1459

References SpellInfo::AttributesEx5, CanInstantCast(), SpellInfo::DmgClass, Object::GetFloatValue(), GetSpellModOwner(), SpellInfo::HasAura(), HasAura(), SpellInfo::Id, SpellInfo::IsChanneled(), IsPet(), m_modAttackSpeedPct, RANGED_ATTACK, SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC, SPELL_AURA_MOUNTED, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELLMOD_CASTING_TIME, SpellInfo::SpellVisual, and UNIT_MOD_CAST_SPEED.

Referenced by SpellInfo::CalcCastTime().

◆ ModSpellDuration()

int32 Unit::ModSpellDuration ( SpellInfo const *  spellProto,
Unit const *  target,
int32  duration,
bool  positive,
uint32  effectMask 
)
14874{
14875 // don't mod permanent auras duration
14876 if (duration < 0)
14877 return duration;
14878
14879 // some auras are not affected by duration modifiers
14880 if (spellProto->HasAttribute(SPELL_ATTR7_NO_TARGET_DURATION_MOD))
14881 return duration;
14882
14883 // cut duration only of negative effects
14884 // xinef: also calculate self casts, spell can be reflected for example
14885 if (!positive)
14886 {
14887 int32 mechanic = spellProto->GetSpellMechanicMaskByEffectMask(effectMask);
14888
14889 int32 durationMod;
14890 int32 durationMod_always = 0;
14891 int32 durationMod_not_stack = 0;
14892
14893 for (uint8 i = 1; i <= MECHANIC_ENRAGED; ++i)
14894 {
14895 if (!(mechanic & 1 << i))
14896 continue;
14897
14898 // Xinef: spells affecting movement imparing effects should not reduce duration if disoriented mechanic is present
14899 if (i == MECHANIC_SNARE && (mechanic & (1 << MECHANIC_DISORIENTED)))
14900 continue;
14901
14902 // Find total mod value (negative bonus)
14903 int32 new_durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD, i);
14904 // Find max mod (negative bonus)
14905 int32 new_durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, i);
14906 // Check if mods applied before were weaker
14907 if (new_durationMod_always < durationMod_always)
14908 durationMod_always = new_durationMod_always;
14909 if (new_durationMod_not_stack < durationMod_not_stack)
14910 durationMod_not_stack = new_durationMod_not_stack;
14911 }
14912
14913 // Select strongest negative mod
14914 if (durationMod_always > durationMod_not_stack)
14915 durationMod = durationMod_not_stack;
14916 else
14917 durationMod = durationMod_always;
14918
14919 if (durationMod != 0)
14920 AddPct(duration, durationMod);
14921
14922 // there are only negative mods currently
14923 durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, spellProto->Dispel);
14924 durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, spellProto->Dispel);
14925
14926 durationMod = 0;
14927 if (durationMod_always > durationMod_not_stack)
14928 durationMod += durationMod_not_stack;
14929 else
14930 durationMod += durationMod_always;
14931
14932 if (durationMod != 0)
14933 AddPct(duration, durationMod);
14934 }
14935 else
14936 {
14937 // else positive mods here, there are no currently
14938 // when there will be, change GetTotalAuraModifierByMiscValue to GetTotalPositiveAuraModifierByMiscValue
14939 }
14940
14941 // Glyphs which increase duration of selfcasted buffs
14942 if (target == this)
14943 {
14944 switch (spellProto->SpellFamilyName)
14945 {
14946 case SPELLFAMILY_DRUID:
14947 if (spellProto->SpellFamilyFlags[0] & 0x100)
14948 {
14949 // Glyph of Thorns
14950 if (AuraEffect* aurEff = GetAuraEffect(57862, 0))
14951 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
14952 }
14953 break;
14955 if ((spellProto->SpellFamilyFlags[0] & 0x00000002) && spellProto->SpellIconID == 298)
14956 {
14957 // Glyph of Blessing of Might
14958 if (AuraEffect* aurEff = GetAuraEffect(57958, 0))
14959 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
14960 }
14961 else if ((spellProto->SpellFamilyFlags[0] & 0x00010000) && spellProto->SpellIconID == 306)
14962 {
14963 // Glyph of Blessing of Wisdom
14964 if (AuraEffect* aurEff = GetAuraEffect(57979, 0))
14965 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
14966 }
14967 break;
14968 }
14969 }
14970 return std::max(duration, 0);
14971}
constexpr auto MINUTE
Definition: Common.h:47
@ SPELL_ATTR7_NO_TARGET_DURATION_MOD
Definition: SharedDefines.h:642
@ MECHANIC_ENRAGED
Definition: SharedDefines.h:1356
@ MECHANIC_DISORIENTED
Definition: SharedDefines.h:1327
@ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK
Definition: SpellAuraDefines.h:309
@ SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK
Definition: SpellAuraDefines.h:297
@ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL
Definition: SpellAuraDefines.h:308
@ SPELL_AURA_MECHANIC_DURATION_MOD
Definition: SpellAuraDefines.h:295

References AddPct(), SpellInfo::Dispel, GetAuraEffect(), GetMaxNegativeAuraModifierByMiscValue(), SpellInfo::GetSpellMechanicMaskByEffectMask(), GetTotalAuraModifierByMiscValue(), SpellInfo::HasAttribute(), IN_MILLISECONDS, MECHANIC_DISORIENTED, MECHANIC_ENRAGED, MECHANIC_SNARE, MINUTE, SPELL_ATTR7_NO_TARGET_DURATION_MOD, SPELL_AURA_MECHANIC_DURATION_MOD, SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, SPELLFAMILY_DRUID, SPELLFAMILY_PALADIN, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, and SpellInfo::SpellIconID.

Referenced by Spell::DoSpellHitOnUnit(), and Spell::EffectInterruptCast().

◆ MonsterMoveWithSpeed()

◆ Mount()

void Unit::Mount ( uint32  mount,
uint32  vehicleId = 0,
uint32  creatureEntry = 0 
)
13466{
13467 if (mount)
13469
13471
13472 if (Player* player = ToPlayer())
13473 {
13474 sScriptMgr->AnticheatSetUnderACKmount(player);
13475
13476 // mount as a vehicle
13477 if (VehicleId)
13478 {
13479 if (CreateVehicleKit(VehicleId, creatureEntry))
13480 {
13481 GetVehicleKit()->Reset();
13482
13483 // Send others that we now have a vehicle
13485 data << GetPackGUID();
13486 data << uint32(VehicleId);
13487 SendMessageToSet(&data, true);
13488
13490 player->GetSession()->SendPacket(&data);
13491
13492 // mounts can also have accessories
13494 }
13495 }
13496
13497 // unsummon pet
13498 Pet* pet = player->GetPet();
13499 if (pet)
13500 {
13502 // don't unsummon pet in arena but SetFlag UNIT_FLAG_STUNNED to disable pet's interface
13503 if (bg && bg->isArena())
13505 else
13506 player->UnsummonPetTemporaryIfAny();
13507 }
13508
13509 // xinef: if we have charmed npc, stun him also
13510 if (Unit* charm = player->GetCharm())
13511 if (charm->IsCreature())
13512 charm->SetUnitFlag(UNIT_FLAG_STUNNED);
13513
13514 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13515 data << GetPackGUID();
13516 data << uint32(GameTime::GetGameTime().count()); // Packet counter
13517 data << player->GetCollisionHeight();
13518 player->GetSession()->SendPacket(&data);
13519 }
13520
13522}
@ AURA_INTERRUPT_FLAG_MOUNT
Definition: SpellDefines.h:60
bool isArena() const
Definition: Battleground.h:413
bool CreateVehicleKit(uint32 id, uint32 creatureEntry)
Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
Definition: Unit.cpp:18716
void Reset(bool evading=false)
Definition: Vehicle.cpp:119
void InstallAllAccessories(bool evading)
Definition: Vehicle.cpp:86

References AURA_INTERRUPT_FLAG_MOUNT, CreateVehicleKit(), Player::GetBattleground(), GetCharm(), GameTime::GetGameTime(), Object::GetPackGUID(), GetVehicleKit(), WorldPacket::Initialize(), Vehicle::InstallAllAccessories(), Battleground::isArena(), RemoveAurasWithInterruptFlags(), Vehicle::Reset(), WorldObject::SendMessageToSet(), SetUInt32Value(), SetUnitFlag(), SMSG_MOVE_SET_COLLISION_HGT, SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, and UNIT_FLAG_STUNNED.

Referenced by AuraEffect::HandleAuraMounted(), spell_mount_check_aura::HandleEffectPeriodic(), modify_commandscript::HandleModifyMountCommand(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::InitializeAI(), boss_captain_skarloc::InitializeAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::JustRespawned(), Creature::LoadCreaturesAddon(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::MountSelf(), npc_scarlet_courier::npc_scarlet_courierAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_mandokir::boss_mandokirAI::Reset(), WorldSession::SendDoFlight(), and npc_koltira_deathweaver::npc_koltira_deathweaverAI::WaypointReached().

◆ NearTeleportTo() [1/2]

void Unit::NearTeleportTo ( float  x,
float  y,
float  z,
float  orientation,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
19986{
19987 DisableSpline();
19988 if (IsPlayer())
19989 ToPlayer()->TeleportTo(GetMapId(), x, y, z, orientation, TELE_TO_NOT_LEAVE_COMBAT | (removeTransport ? 0 : TELE_TO_NOT_LEAVE_TRANSPORT) | TELE_TO_NOT_UNSUMMON_PET | (casting ? TELE_TO_SPELL : 0) | (vehicleTeleport ? TELE_TO_NOT_LEAVE_VEHICLE : 0) | (withPet ? TELE_TO_WITH_PET : 0));
19990 else
19991 {
19992 Position pos = {x, y, z, orientation};
19993 SendTeleportPacket(pos);
19994 UpdatePosition(x, y, z, orientation, true);
19997 }
19998}
@ TELE_TO_WITH_PET
Definition: Player.h:827
@ TELE_TO_NOT_LEAVE_VEHICLE
Definition: Player.h:826
@ TELE_TO_SPELL
Definition: Player.h:825
@ TELE_TO_NOT_LEAVE_COMBAT
Definition: Player.h:823
@ TELE_TO_NOT_UNSUMMON_PET
Definition: Player.h:824
@ TELE_TO_NOT_LEAVE_TRANSPORT
Definition: Player.h:822
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition: Player.cpp:1331
void SendTeleportPacket(Position &pos)
Definition: Unit.cpp:20007
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition: Unit.cpp:19131
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition: Unit.cpp:20026
void ReinitializeMovement()
Definition: MotionMaster.cpp:904

References DisableSpline(), WorldLocation::GetMapId(), GetMotionMaster(), Object::IsPlayer(), MotionMaster::ReinitializeMovement(), SendTeleportPacket(), TELE_TO_NOT_LEAVE_COMBAT, TELE_TO_NOT_LEAVE_TRANSPORT, TELE_TO_NOT_LEAVE_VEHICLE, TELE_TO_NOT_UNSUMMON_PET, TELE_TO_SPELL, TELE_TO_WITH_PET, Player::TeleportTo(), Object::ToPlayer(), UpdateObjectVisibility(), and UpdatePosition().

◆ NearTeleportTo() [2/2]

void Unit::NearTeleportTo ( Position pos,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
19981{
19982 NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), casting, vehicleTeleport, withPet, removeTransport);
19983}
void NearTeleportTo(Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
Definition: Unit.cpp:19980

References Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and NearTeleportTo().

Referenced by boss_viscidus::DamageTaken(), npc_madrigosa::DoAction(), npc_akama_illidan::DoAction(), Spell::EffectLeap(), Spell::EffectResurrectPet(), Spell::EffectStuck(), Spell::EffectSummonPet(), Spell::EffectTeleportUnits(), Spell::EffectTeleUnitsFaceCaster(), npc_giant_claw_tentacle::Emerge(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), BattlegroundBE::HandleAreaTrigger(), BattlegroundDS::HandleAreaTrigger(), BattlegroundNA::HandleAreaTrigger(), BattlegroundRL::HandleAreaTrigger(), BattlegroundRV::HandleAreaTrigger(), spell_moroes_vanish::HandleDummy(), spell_class_call_handler::HandleOnHitRogue(), npc_echo_of_medivh::HandlePieceJustDied(), BattlegroundBE::HandlePlayerUnderMap(), BattlegroundDS::HandlePlayerUnderMap(), BattlegroundNA::HandlePlayerUnderMap(), BattlegroundRL::HandlePlayerUnderMap(), BattlegroundRV::HandlePlayerUnderMap(), npc_pet_mage_mirror_image::InitializeAI(), boss_urom::boss_uromAI::JustDied(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_grandmaster_vorpil::JustEngagedWith(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), NearTeleportTo(), npc_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_chesspiece::OnCharmed(), npc_vh_sinclari::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), boss_gothik::boss_gothikAI::Reset(), Map::ScriptsProcess(), npc_midsummer_torch_target::SelectPosition(), npc_simon_bunny::npc_simon_bunnyAI::SetUpPreGame(), boss_urom::boss_uromAI::SpellHit(), boss_majordomo::boss_majordomoAI::SpellHit(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), npc_pos_leader_second::npc_pos_leader_secondAI::SpellHitTarget(), boss_cyanigosa::boss_cyanigosaAI::SpellHitTarget(), BattlegroundRV::TeleportUnitToNewZ(), Vehicle::TeleportVehicle(), npc_doomfire_spirit::TryTeleportInDirection(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), and npc_minigob_manabonk::UpdateAI().

◆ OutDebugInfo()

void Unit::OutDebugInfo ( ) const
20236{
20237 LOG_ERROR("entities.unit", "Unit::OutDebugInfo");
20238 LOG_INFO("entities.unit", "GUID {}, name {}", GetGUID().ToString(), GetName());
20239 LOG_INFO("entities.unit", "OwnerGUID {}, MinionGUID {}, CharmerGUID {}, CharmedGUID {}",
20241 LOG_INFO("entities.unit", "In world {}, unit type mask {}", (uint32)(IsInWorld() ? 1 : 0), m_unitTypeMask);
20242 if (IsInWorld())
20243 LOG_INFO("entities.unit", "Mapid {}", GetMapId());
20244
20245 LOG_INFO("entities.unit", "Summon Slot: ");
20246 for (uint32 i = 0; i < MAX_SUMMON_SLOT; ++i)
20247 LOG_INFO("entities.unit", "{}, ", m_SummonSlot[i].ToString());
20248 LOG_INFO("server.loading", " ");
20249
20250 LOG_INFO("entities.unit", "Controlled List: ");
20251 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20252 LOG_INFO("entities.unit", "{}, ", (*itr)->GetGUID().ToString());
20253 LOG_INFO("server.loading", " ");
20254
20255 LOG_INFO("entities.unit", "Aura List: ");
20256 for (AuraApplicationMap::const_iterator itr = m_appliedAuras.begin(); itr != m_appliedAuras.end(); ++itr)
20257 LOG_INFO("entities.unit", "{}, ", itr->first);
20258 LOG_INFO("server.loading", " ");
20259
20260 if (IsVehicle())
20261 {
20262 LOG_INFO("entities.unit", "Passenger List: ");
20263 for (SeatMap::iterator itr = GetVehicleKit()->Seats.begin(); itr != GetVehicleKit()->Seats.end(); ++itr)
20264 if (Unit* passenger = ObjectAccessor::GetUnit(*GetVehicleBase(), itr->second.Passenger.Guid))
20265 LOG_INFO("entities.unit", "{}, ", passenger->GetGUID().ToString());
20266 LOG_INFO("server.loading", " ");
20267 }
20268
20269 if (GetVehicle())
20270 LOG_INFO("entities.unit", "On vehicle {}.", GetVehicleBase()->GetEntry());
20271}
Seats
Definition: boss_flame_leviathan.cpp:167

References GetCharmerGUID(), GetCharmGUID(), Object::GetEntry(), Object::GetGUID(), WorldLocation::GetMapId(), GetMinionGUID(), WorldObject::GetName(), GetOwnerGUID(), ObjectAccessor::GetUnit(), GetVehicle(), GetVehicleBase(), GetVehicleKit(), Object::IsInWorld(), IsVehicle(), LOG_ERROR, LOG_INFO, m_appliedAuras, m_Controlled, m_SummonSlot, m_unitTypeMask, MAX_SUMMON_SLOT, and Position::ToString().

Referenced by SetMinion().

◆ PatchValuesUpdate()

void Unit::PatchValuesUpdate ( ByteBuffer valuesUpdateBuf,
BuildValuesCachePosPointers posPointers,
Player target 
)
private
20848{
20849 Creature const* creature = ToCreature();
20850
20851 // UNIT_NPC_FLAGS
20852 if (creature && posPointers.UnitNPCFlagsPos >= 0)
20853 {
20854 uint32 appendValue = m_uint32Values[UNIT_NPC_FLAGS];
20855
20856 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && appendValue & UNIT_NPC_FLAG_FLIGHTMASTER)
20857 appendValue |= UNIT_NPC_FLAG_GOSSIP; // flight masters need NPC gossip flag to show instant flight toggle option
20858
20859 if (!target->CanSeeSpellClickOn(creature))
20860 appendValue &= ~UNIT_NPC_FLAG_SPELLCLICK;
20861
20862 if (!target->CanSeeVendor(creature))
20863 appendValue &= ~UNIT_NPC_FLAG_VENDOR_MASK;
20864
20865 if (!creature->IsValidTrainerForPlayer(target, &appendValue))
20866 appendValue &= ~UNIT_NPC_FLAG_TRAINER;
20867
20868 valuesUpdateBuf.put(posPointers.UnitNPCFlagsPos, appendValue);
20869 }
20870
20871 // UNIT_FIELD_AURASTATE
20872 if (posPointers.UnitFieldAuraStatePos >= 0)
20873 valuesUpdateBuf.put(posPointers.UnitFieldAuraStatePos, uint32(BuildAuraStateUpdateForTarget(target)));
20874
20875 // UNIT_FIELD_FLAGS
20876 if (posPointers.UnitFieldFlagsPos >= 0)
20877 {
20878 uint32 appendValue = m_uint32Values[UNIT_FIELD_FLAGS];
20879 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
20880 appendValue &= ~UNIT_FLAG_NOT_SELECTABLE;
20881
20882 valuesUpdateBuf.put(posPointers.UnitFieldFlagsPos, appendValue);
20883 }
20884
20885 // UNIT_FIELD_DISPLAYID
20886 // Use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures.
20887 if (posPointers.UnitFieldDisplayPos >= 0)
20888 {
20890 if (creature)
20891 {
20892 CreatureTemplate const* cinfo = creature->GetCreatureTemplate();
20893
20894 // this also applies for transform auras
20895 if (SpellInfo const* transform = sSpellMgr->GetSpellInfo(getTransForm()))
20896 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
20897 if (transform->Effects[i].IsAura(SPELL_AURA_TRANSFORM))
20898 if (CreatureTemplate const* transformInfo = sObjectMgr->GetCreatureTemplate(transform->Effects[i].MiscValue))
20899 {
20900 cinfo = transformInfo;
20901 break;
20902 }
20903
20905 {
20906 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
20907 {
20908 displayId = cinfo->GetFirstVisibleModel()->CreatureDisplayID;
20909 }
20910 else
20911 {
20912 displayId = cinfo->GetFirstInvisibleModel()->CreatureDisplayID;
20913 }
20914 }
20915 }
20916
20917 valuesUpdateBuf.put(posPointers.UnitFieldDisplayPos, uint32(displayId));
20918 }
20919
20920 // UNIT_DYNAMIC_FLAGS
20921 // Hide lootable animation for unallowed players.
20922 if (posPointers.UnitDynamicFlagsPos >= 0)
20923 {
20925
20926 if (creature)
20927 {
20928 if (creature->hasLootRecipient())
20929 {
20930 dynamicFlags |= UNIT_DYNFLAG_TAPPED;
20931 if (creature->isTappedBy(target))
20932 dynamicFlags |= UNIT_DYNFLAG_TAPPED_BY_PLAYER;
20933 }
20934
20935 if (!target->isAllowedToLoot(creature))
20936 dynamicFlags &= ~UNIT_DYNFLAG_LOOTABLE;
20937 }
20938
20939 // unit UNIT_DYNFLAG_TRACK_UNIT should only be sent to caster of SPELL_AURA_MOD_STALKED auras
20940 if (dynamicFlags & UNIT_DYNFLAG_TRACK_UNIT)
20942 dynamicFlags &= ~UNIT_DYNFLAG_TRACK_UNIT;
20943
20944 valuesUpdateBuf.put(posPointers.UnitDynamicFlagsPos, dynamicFlags);
20945 }
20946
20947 // UNIT_FIELD_BYTES_2
20948 if (posPointers.UnitFieldBytes2Pos >= 0)
20949 {
20950 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
20951 {
20953 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
20954 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
20955 // Allow targetting opposite faction in party when enabled in config
20956 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & ((UNIT_BYTE2_FLAG_SANCTUARY /*| UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5*/) << 8))); // this flag is at uint8 offset 1 !!
20957 }// pussywizard / Callmephil
20958 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
20959 (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject()))
20960 {
20961 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & 0xFFFFF2FF)); // clear UNIT_BYTE2_FLAG_PVP, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY
20962 }
20963 }
20964
20965 // UNIT_FIELD_FACTIONTEMPLATE
20966 if (posPointers.UnitFieldFactionTemplatePos >= 0)
20967 {
20968 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
20969 {
20971 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
20972 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
20973 // pretend that all other HOSTILE players have own faction, to allow follow, heal, rezz (trade wont work)
20974 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
20975 }// pussywizard / Callmephil
20976 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
20977 (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject()))
20978 {
20979 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
20980 }
20981 }
20982
20983 sScriptMgr->OnPatchValuesUpdate(this, valuesUpdateBuf, posPointers, target);
20984}
@ UNIT_DYNFLAG_TRACK_UNIT
Definition: SharedDefines.h:3122
@ CONFIG_INSTANT_TAXI
Definition: IWorld.h:382
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition: IWorld.h:75
@ CREATURE_FLAG_EXTRA_TRIGGER
Definition: CreatureData.h:52
bool IsValidTrainerForPlayer(Player *player, uint32 *npcFlags=nullptr) const
Definition: Creature.cpp:1265
bool isTappedBy(Player const *player) const
Definition: Creature.cpp:1381
uint32 CreatureDisplayID
Definition: CreatureData.h:179
CreatureModel const * GetFirstInvisibleModel() const
Definition: Creature.cpp:161
CreatureModel const * GetFirstVisibleModel() const
Definition: Creature.cpp:171
bool isAllowedToLoot(Creature const *creature)
Definition: PlayerStorage.cpp:5620
bool CanSeeVendor(Creature const *creature) const
Definition: Player.cpp:14309
bool IsSpectator() const
Definition: Player.h:2559
bool CanSeeSpellClickOn(Creature const *creature) const
Definition: Player.cpp:14286
uint32 BuildAuraStateUpdateForTarget(Unit *target) const
Definition: Unit.cpp:10536
int32 UnitFieldFlagsPos
Definition: UnitUtils.h:99
int32 UnitFieldDisplayPos
Definition: UnitUtils.h:100
int32 UnitDynamicFlagsPos
Definition: UnitUtils.h:101
int32 UnitFieldAuraStatePos
Definition: UnitUtils.h:98
int32 UnitFieldFactionTemplatePos
Definition: UnitUtils.h:103
int32 UnitFieldBytes2Pos
Definition: UnitUtils.h:102
int32 UnitNPCFlagsPos
Definition: UnitUtils.h:97
bool IsGMAccount() const
Definition: WorldSession.cpp:181
void put(std::size_t pos, T value)
Definition: ByteBuffer.h:137

References BuildAuraStateUpdateForTarget(), Player::CanSeeSpellClickOn(), Player::CanSeeVendor(), CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP, CONFIG_INSTANT_TAXI, CREATURE_FLAG_EXTRA_TRIGGER, CreatureModel::CreatureDisplayID, WorldObject::FindMap(), CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), GetFaction(), GetFactionTemplateEntry(), CreatureTemplate::GetFirstInvisibleModel(), CreatureTemplate::GetFirstVisibleModel(), Object::GetGUID(), Player::GetSession(), getTransForm(), HasAuraTypeWithCaster(), Creature::hasLootRecipient(), Player::isAllowedToLoot(), Map::IsBattleArena(), IsControlledByPlayer(), FactionTemplateEntry::IsFriendlyTo(), Player::IsGameMaster(), WorldSession::IsGMAccount(), IsInRaidWith(), Player::IsSpectator(), Creature::isTappedBy(), Creature::IsValidTrainerForPlayer(), Object::m_uint32Values, MAX_SPELL_EFFECTS, ByteBuffer::put(), sObjectMgr, SPELL_AURA_MOD_STALKED, SPELL_AURA_TRANSFORM, sScriptMgr, sSpellMgr, sWorld, Object::ToCreature(), UNIT_BYTE2_FLAG_SANCTUARY, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, UNIT_DYNFLAG_TRACK_UNIT, UNIT_FIELD_BYTES_2, UNIT_FIELD_DISPLAYID, UNIT_FIELD_FLAGS, UNIT_NPC_FLAG_FLIGHTMASTER, UNIT_NPC_FLAG_GOSSIP, UNIT_NPC_FLAGS, BuildValuesCachePosPointers::UnitDynamicFlagsPos, BuildValuesCachePosPointers::UnitFieldAuraStatePos, BuildValuesCachePosPointers::UnitFieldBytes2Pos, BuildValuesCachePosPointers::UnitFieldDisplayPos, BuildValuesCachePosPointers::UnitFieldFactionTemplatePos, BuildValuesCachePosPointers::UnitFieldFlagsPos, and BuildValuesCachePosPointers::UnitNPCFlagsPos.

Referenced by BuildValuesUpdate().

◆ PauseMovement()

void Unit::PauseMovement ( uint32  timer = 0,
uint8  slot = 0 
)
virtual

Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline.

16671{
16672 if (slot >= MAX_MOTION_SLOT)
16673 return;
16674
16675 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16676 movementGenerator->Pause(timer);
16677
16678 StopMoving();
16679}
@ MAX_MOTION_SLOT
Definition: MotionMaster.h:66
void StopMoving()
Definition: Unit.cpp:16651
Definition: MovementGenerator.h:28

References GetMotionMaster(), MAX_MOTION_SLOT, and StopMoving().

Referenced by WorldSession::HandleBattlemasterHelloOpcode(), WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::SendListInventory(), and boss_shade_of_aran::SetGUID().

◆ PetSpellFail()

void Unit::PetSpellFail ( SpellInfo const *  spellInfo,
Unit target,
uint32  result 
)
20346{
20347 CharmInfo* charmInfo = GetCharmInfo();
20348 if (!charmInfo || !IsCreature())
20349 return;
20350
20352 {
20353 if ((result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE) || !ToCreature()->HasReactState(REACT_PASSIVE))
20354 if (Unit* owner = GetOwner())
20355 {
20356 if (spellInfo->IsPositive() && IsFriendlyTo(target))
20357 {
20358 AttackStop();
20359 charmInfo->SetIsAtStay(false);
20360 charmInfo->SetIsCommandAttack(true);
20361 charmInfo->SetIsReturning(false);
20362 charmInfo->SetIsFollowing(false);
20363
20364 GetMotionMaster()->MoveFollow(target, PET_FOLLOW_DIST, rand_norm() * 2 * M_PI);
20365 }
20366 else if (owner->IsValidAttackTarget(target))
20367 {
20368 AttackStop();
20369 charmInfo->SetIsAtStay(false);
20370 charmInfo->SetIsCommandAttack(true);
20371 charmInfo->SetIsReturning(false);
20372 charmInfo->SetIsFollowing(false);
20373
20374 if (!ToCreature()->HasReactState(REACT_PASSIVE))
20375 ToCreature()->AI()->AttackStart(target);
20376 else
20377 GetMotionMaster()->MoveChase(target);
20378 }
20379 }
20380
20381 // can be extended in future
20382 if (result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE)
20383 {
20384 charmInfo->SetForcedSpell(spellInfo->IsPositive() ? -int32(spellInfo->Id) : spellInfo->Id);
20385 charmInfo->SetForcedTargetGUID(target->GetGUID());
20386 }
20387 else
20388 {
20389 charmInfo->SetForcedSpell(0);
20391 }
20392 }
20393}
@ SPELL_FAILED_OUT_OF_RANGE
Definition: SharedDefines.h:1046
@ SPELL_FAILED_LINE_OF_SIGHT
Definition: SharedDefines.h:996
#define PET_FOLLOW_DIST
Definition: PetDefines.h:198
bool IsPathfindingEnabled(const Map *map)
Definition: DisableMgr.cpp:412
virtual void AttackStart(Unit *)
Definition: UnitAI.cpp:27
void SetIsAtStay(bool val)
Definition: CharmInfo.cpp:365
void SetIsFollowing(bool val)
Definition: CharmInfo.cpp:375
void SetIsReturning(bool val)
Definition: CharmInfo.cpp:385
void SetForcedSpell(uint32 id)
Definition: CharmInfo.h:176
void SetForcedTargetGUID(ObjectGuid guid=ObjectGuid::Empty)
Definition: CharmInfo.h:178
void SetIsCommandAttack(bool val)
Definition: CharmInfo.cpp:303
void MoveChase(Unit *target, std::optional< ChaseRange > dist={}, std::optional< ChaseAngle > angle={})
Force the unit to chase this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:313
void MoveFollow(Unit *target, float dist, float angle, MovementSlot slot=MOTION_SLOT_ACTIVE, bool inheritWalkState=true)
The unit will follow this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:409

References Creature::AI(), UnitAI::AttackStart(), AttackStop(), ObjectGuid::Empty, GetCharmInfo(), Object::GetGUID(), WorldObject::GetMap(), GetMotionMaster(), GetOwner(), SpellInfo::Id, Object::IsCreature(), IsFriendlyTo(), DisableMgr::IsPathfindingEnabled(), SpellInfo::IsPositive(), MotionMaster::MoveChase(), MotionMaster::MoveFollow(), PET_FOLLOW_DIST, rand_norm(), REACT_PASSIVE, CharmInfo::SetForcedSpell(), CharmInfo::SetForcedTargetGUID(), CharmInfo::SetIsAtStay(), CharmInfo::SetIsCommandAttack(), CharmInfo::SetIsFollowing(), CharmInfo::SetIsReturning(), SPELL_FAILED_LINE_OF_SIGHT, SPELL_FAILED_OUT_OF_RANGE, and Object::ToCreature().

Referenced by WorldSession::HandlePetActionHelper(), and WorldSession::HandlePetCastSpellOpcode().

◆ ProcDamageAndSpell()

void Unit::ProcDamageAndSpell ( Unit actor,
Unit victim,
uint32  procAttacker,
uint32  procVictim,
uint32  procEx,
uint32  amount,
WeaponAttackType  attType = BASE_ATTACK,
SpellInfo const *  procSpellInfo = nullptr,
SpellInfo const *  procAura = nullptr,
int8  procAuraEffectIndex = -1,
Spell const *  procSpell = nullptr,
DamageInfo damageInfo = nullptr,
HealInfo healInfo = nullptr,
uint32  procPhase = 2 
)
static
6379{
6380 // Not much to do if no flags are set.
6381 if (procAttacker && actor)
6382 actor->ProcDamageAndSpellFor(false, victim, procAttacker, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6383 // Now go on with a victim's events'n'auras
6384 // Not much to do if no flags are set or there is no victim
6385 if (victim && victim->IsAlive() && procVictim)
6386 victim->ProcDamageAndSpellFor(true, actor, procVictim, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6387}

References IsAlive(), and ProcDamageAndSpellFor().

Referenced by Spell::_cast(), Spell::_handle_finish_phase(), AttackerStateUpdate(), Spell::DoAllEffectOnTarget(), ReflectEvent::Execute(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and Kill().

◆ ProcDamageAndSpellFor()

void Unit::ProcDamageAndSpellFor ( bool  isVictim,
Unit target,
uint32  procFlag,
uint32  procExtra,
WeaponAttackType  attType,
SpellInfo const *  procSpellInfo,
uint32  damage,
SpellInfo const *  procAura = nullptr,
int8  procAuraEffectIndex = -1,
Spell const *  procSpell = nullptr,
DamageInfo damageInfo = nullptr,
HealInfo healInfo = nullptr,
uint32  procPhase = 2 
)
16056{
16057 // Player is loaded now - do not allow passive spell casts to proc
16058 if (IsPlayer() && ToPlayer()->GetSession()->PlayerLoading())
16059 return;
16060 // For melee/ranged based attack need update skills and set some Aura states if victim present
16061 if (procFlag & MELEE_BASED_TRIGGER_MASK && target && procPhase == PROC_SPELL_PHASE_HIT)
16062 {
16063 // Xinef: Shaman in ghost wolf form cant proc anything melee based
16064 if (!isVictim && GetShapeshiftForm() == FORM_GHOSTWOLF)
16065 return;
16066
16067 // Update skills here for players
16068 // only when you are not fighting other players or their pets/totems (pvp)
16069 if (IsPlayer() && !target->IsCharmedOwnedByPlayerOrPlayer())
16070 {
16071 // On melee based hit/miss/resist/parry/dodge need to update skill (for victim and attacker)
16073 {
16074 ToPlayer()->UpdateCombatSkills(target, attType, isVictim, procSpell ? procSpell->m_weaponItem : nullptr);
16075 }
16076 // Update defence if player is victim and we block - TODO: confirm that blocked attacks only have a chance to increase defence skill
16077 else if (isVictim && procExtra & (PROC_EX_BLOCK))
16078 {
16079 ToPlayer()->UpdateCombatSkills(target, attType, true);
16080 }
16081 }
16082 // If exist crit/parry/dodge/block need update aura state (for victim and attacker)
16084 {
16085 // for victim
16086 if (isVictim)
16087 {
16088 // if victim and dodge attack
16089 if (procExtra & PROC_EX_DODGE)
16090 {
16091 // Update AURA_STATE on dodge
16092 if (!IsClass(CLASS_ROGUE, CLASS_CONTEXT_ABILITY_REACTIVE)) // skip Rogue Riposte
16093 {
16096 }
16097 }
16098 // if victim and parry attack
16099 if (procExtra & PROC_EX_PARRY)
16100 {
16101 // For Hunters only Counterattack (skip Mongoose bite)
16103 {
16106 }
16107 else
16108 {
16111 }
16112 }
16113 // if and victim block attack
16114 if (procExtra & PROC_EX_BLOCK)
16115 {
16118 }
16119 }
16120 else // For attacker
16121 {
16122 // Overpower on victim dodge
16123 if (procExtra & PROC_EX_DODGE)
16124 {
16126 {
16127 AddComboPoints(target, 1);
16129 }
16130 }
16131
16132 // Wolverine Bite
16133 if ((procExtra & PROC_HIT_CRITICAL) && IsHunterPet())
16134 {
16135 AddComboPoints(target, 1);
16137 }
16138 }
16139 }
16140 }
16141
16142 Unit* actor = isVictim ? target : this;
16143 Unit* actionTarget = !isVictim ? target : this;
16144
16145 ProcEventInfo eventInfo = ProcEventInfo(actor, actionTarget, target, procFlag, 0, procPhase, procExtra, procSpell, damageInfo, healInfo, procAura, procAuraEffectIndex);
16146
16147 ProcTriggeredList procTriggered;
16148 // Fill procTriggered list
16149 for (AuraApplicationMap::const_iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16150 {
16151 // Do not allow auras to proc from effect triggered by itself
16152 if (procAura && procAura->Id == itr->first)
16153 continue;
16154
16155 // Xinef: Generic Item Equipment cooldown, -1 is a special marker
16156 if (itr->second->GetBase()->GetCastItemGUID() && HasSpellItemCooldown(itr->first, uint32(-1)))
16157 continue;
16158
16159 ProcTriggeredData triggerData(itr->second->GetBase());
16160 // Defensive procs are active on absorbs (so absorption effects are not a hindrance)
16161 bool active = damage || (procExtra & PROC_EX_BLOCK && isVictim);
16162 if (isVictim)
16163 procExtra &= ~PROC_EX_INTERNAL_REQ_FAMILY;
16164
16165 SpellInfo const* spellProto = itr->second->GetBase()->GetSpellInfo();
16166
16167 // only auras that have trigger spell should proc from fully absorbed damage
16168 if (procExtra & PROC_EX_ABSORB && isVictim)
16169 if (damage || spellProto->Effects[EFFECT_0].TriggerSpell || spellProto->Effects[EFFECT_1].TriggerSpell || spellProto->Effects[EFFECT_2].TriggerSpell)
16170 active = true;
16171
16172 // xinef: fix spell procing from damaging / healing casts if spell has DoT / HoT effect only
16173 // only player spells are taken into account
16174 if (!active && !isVictim && !(procFlag & PROC_FLAG_DONE_PERIODIC) && procSpellInfo && procSpellInfo->SpellFamilyName && (procSpellInfo->HasAura(SPELL_AURA_PERIODIC_DAMAGE) || procSpellInfo->HasAura(SPELL_AURA_PERIODIC_HEAL)))
16175 active = true;
16176
16177 // AuraScript Hook
16178 if (!triggerData.aura->CallScriptCheckProcHandlers(itr->second, eventInfo))
16179 {
16180 continue;
16181 }
16182
16183 bool isTriggeredAtSpellProcEvent = IsTriggeredAtSpellProcEvent(target, triggerData.aura, attType, isVictim, active, triggerData.spellProcEvent, eventInfo);
16184
16185 // AuraScript Hook
16186 if (!triggerData.aura->CallScriptAfterCheckProcHandlers(itr->second, eventInfo, isTriggeredAtSpellProcEvent))
16187 {
16188 continue;
16189 }
16190
16191 // do checks using conditions table
16192 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_SPELL_PROC, spellProto->Id);
16193 ConditionSourceInfo condInfo = ConditionSourceInfo(eventInfo.GetActor(), eventInfo.GetActionTarget());
16194 if (!sConditionMgr->IsObjectMeetToConditions(condInfo, conditions))
16195 {
16196 continue;
16197 }
16198
16199 // Triggered spells not triggering additional spells
16200 //bool triggered = !spellProto->HasAttribute(SPELL_ATTR3_CAN_PROC_FROM_PROCS) ?
16201 // (procExtra & PROC_EX_INTERNAL_TRIGGERED && !(procFlag & PROC_FLAG_DONE_TRAP_ACTIVATION)) : false;
16202
16203 bool hasTriggeredProc = false;
16204 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
16205 {
16206 if (itr->second->HasEffect(i))
16207 {
16208 AuraEffect* aurEff = itr->second->GetBase()->GetEffect(i);
16209
16210 // Skip this auras
16211 if (isNonTriggerAura[aurEff->GetAuraType()])
16212 continue;
16213
16214 // If not trigger by default and spellProcEvent == nullptr - skip
16215 if (!isTriggerAura[aurEff->GetAuraType()] && !triggerData.spellProcEvent)
16216 continue;
16217
16218 switch (aurEff->GetAuraType())
16219 {
16222 case SPELL_AURA_DUMMY:
16224 if (uint32 triggerSpellId = aurEff->GetSpellInfo()->Effects[i].TriggerSpell)
16225 {
16226 triggerData.triggerSpelId[i] = triggerSpellId;
16227 hasTriggeredProc = true;
16228 }
16229 break;
16230 default:
16231 break;
16232 }
16233
16234 // Some spells must always trigger
16235 //if (isAlwaysTriggeredAura[aurEff->GetAuraType()])
16236 triggerData.effMask |= 1 << i;
16237 }
16238 }
16239
16240 if (triggerData.effMask)
16241 {
16242 // If there is aura that triggers another proc aura, make sure that the triggered one is going to be proccessed on top of it
16243 if (hasTriggeredProc)
16244 {
16245 bool proccessed = false;
16246 for (uint8 i = 0; i < EFFECT_ALL; ++i)
16247 {
16248 if (uint32 triggeredSpellId = triggerData.triggerSpelId[i])
16249 {
16250 auto iter = std::find(procTriggered.begin(), procTriggered.end(), triggeredSpellId);
16251 if (iter != procTriggered.end())
16252 {
16253 std::advance(iter, 1);
16254 procTriggered.insert(iter, triggerData);
16255 proccessed = true;
16256 break;
16257 }
16258 }
16259 }
16260
16261 if (!proccessed)
16262 {
16263 procTriggered.push_front(triggerData);
16264 }
16265 }
16266 else
16267 {
16268 procTriggered.push_front(triggerData);
16269 }
16270 }
16271 }
16272
16273 // Nothing found
16274 if (procTriggered.empty())
16275 return;
16276
16277 // Note: must SetCantProc(false) before return
16279 SetCantProc(true);
16280
16281 // Handle effects proceed this time
16282 for (ProcTriggeredList::const_iterator i = procTriggered.begin(); i != procTriggered.end(); ++i)
16283 {
16284 // look for aura in auras list, it may be removed while proc event processing
16285 if (i->aura->IsRemoved())
16286 continue;
16287
16288 bool useCharges = i->aura->IsUsingCharges();
16289 // no more charges to use, prevent proc
16290 if (useCharges && !i->aura->GetCharges())
16291 continue;
16292
16293 bool takeCharges = false;
16294 SpellInfo const* spellInfo = i->aura->GetSpellInfo();
16295
16296 AuraApplication* aurApp = i->aura->GetApplicationOfTarget(GetGUID());
16297
16298 bool prepare = i->aura->CallScriptPrepareProcHandlers(aurApp, eventInfo);
16299
16300 // For players set spell cooldown if need
16301 uint32 cooldown = 0;
16302 if (prepare && i->spellProcEvent && i->spellProcEvent->cooldown)
16303 cooldown = i->spellProcEvent->cooldown;
16304
16305 // Xinef: set cooldown for actual proc
16306 eventInfo.SetProcCooldown(cooldown);
16307
16308 // Note: must SetCantProc(false) before return
16310 SetCantProc(true);
16311
16312 bool handled = i->aura->CallScriptProcHandlers(aurApp, eventInfo);
16313
16314 // "handled" is needed as long as proc can be handled in multiple places
16315 if (!handled && HandleAuraProc(target, damage, i->aura, procSpellInfo, procFlag, procExtra, cooldown, &handled))
16316 {
16317 uint32 Id = i->aura->GetId();
16318 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), Id);
16319 takeCharges = true;
16320 }
16321
16322 if (!handled)
16323 for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex)
16324 {
16325 if (!(i->effMask & (1 << effIndex)))
16326 continue;
16327
16328 AuraEffect* triggeredByAura = i->aura->GetEffect(effIndex);
16329 ASSERT(triggeredByAura);
16330
16331 bool prevented = i->aura->CallScriptEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16332 if (prevented)
16333 {
16334 takeCharges = true;
16335 continue;
16336 }
16337
16338 switch (triggeredByAura->GetAuraType())
16339 {
16341 {
16342 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16343 // Don`t drop charge or add cooldown for not started trigger
16344 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16345 takeCharges = true;
16346 break;
16347 }
16349 {
16350 // target has to be valid
16351 if (!eventInfo.GetProcTarget())
16352 break;
16353
16354 triggeredByAura->HandleProcTriggerDamageAuraProc(aurApp, eventInfo); // this function is part of the new proc system
16355 takeCharges = true;
16356 break;
16357 }
16359 case SPELL_AURA_DUMMY:
16360 {
16361 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} dummy aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16362 if (HandleDummyAuraProc(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, eventInfo))
16363 takeCharges = true;
16364 break;
16365 }
16370 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, isVictim ? "a victim's" : "an attacker's", triggeredByAura->GetId());
16371 takeCharges = true;
16372 break;
16374 {
16375 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16376 if (HandleOverrideClassScriptAuraProc(target, damage, triggeredByAura, procSpellInfo, cooldown))
16377 takeCharges = true;
16378 break;
16379 }
16381 {
16382 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16383 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16384 if (damage > 0)
16385 {
16387 takeCharges = true;
16388 }
16389 break;
16390 }
16392 {
16393 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16394 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16395 HandleAuraRaidProcFromCharge(triggeredByAura);
16396 takeCharges = true;
16397 break;
16398 }
16400 {
16401 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16402
16403 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16404 takeCharges = true;
16405 break;
16406 }
16408 // Skip melee hits or instant cast spells
16409 // xinef: check channeled spells which are affected by haste also
16410 if (procSpellInfo && (procSpellInfo->SpellFamilyName || !IsPlayer()) &&
16411 (procSpellInfo->CalcCastTime() > 0 /*||
16412 (procSpell->IsChanneled() && procSpell->GetDuration() > 0 && (HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, procSpell) || procSpell->HasAttribute(SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC)))*/))
16413 takeCharges = true;
16414 break;
16416 // Skip Melee hits and spells ws wrong school
16417 if (procSpellInfo && (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16418 takeCharges = true;
16419 break;
16421 // Skip Melee hits and targets with magnet aura
16422 if (procSpellInfo && (triggeredByAura->GetBase()->GetUnitOwner()->ToUnit() == ToUnit())) // Magnet
16423 takeCharges = true;
16424 break;
16427 // Skip melee hits and spells ws wrong school or zero cost
16428 if (procSpellInfo &&
16429 (procSpellInfo->ManaCost != 0 || procSpellInfo->ManaCostPercentage != 0 || (procSpellInfo->SpellFamilyFlags[1] & 0x2)) && // Cost check, mutilate include
16430 (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16431 takeCharges = true;
16432 break;
16435 // Compare mechanic
16436 if (procSpellInfo && procSpellInfo->Mechanic == uint32(triggeredByAura->GetMiscValue()))
16437 takeCharges = true;
16438 break;
16440 // Compare casters
16441 if (target && triggeredByAura->GetCasterGUID() == target->GetGUID())
16442 takeCharges = true;
16443 break;
16444 // CC Auras which use their amount amount to drop
16445 // Are there any more auras which need this?
16451 {
16452 // Spell own direct damage at apply wont break the CC
16453 // Xinef: Or when the aura is at full duration (assume that such auras should be added at the end, skipping all damage procs etc.)
16454 if (procSpellInfo)
16455 if ((!i->aura->IsPermanent() && i->aura->GetDuration() == i->aura->GetMaxDuration()) || procSpellInfo->Id == triggeredByAura->GetId() ||
16456 procSpellInfo->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
16457 break;
16458
16459 // chargeable mods are breaking on hit
16460 if (useCharges)
16461 takeCharges = true;
16462 else if (triggeredByAura->GetAmount()) // aura must have amount
16463 {
16464 int32 damageLeft = triggeredByAura->GetAmount();
16465 // No damage left
16466 if (damageLeft < int32(damage))
16467 i->aura->Remove();
16468 else
16469 triggeredByAura->SetAmount(damageLeft - damage);
16470 }
16471 break;
16472 }
16474 if (procSpellInfo && procSpellInfo->Id == 20647) // hack for warriors execute, both dummy and damage spell are affected by ignore aurastate aura
16475 break;
16476 takeCharges = true;
16477 break;
16480 {
16481 if (triggeredByAura->GetSpellModifier())
16482 {
16483 // Do proc if mod is consumed by spell
16484 if (!procSpell || procSpell->m_appliedMods.find(i->aura) != procSpell->m_appliedMods.end())
16485 {
16486 takeCharges = true;
16487 }
16488 }
16489 break;
16490 }
16491 default:
16492 takeCharges = true;
16493 break;
16494 }
16495 i->aura->CallScriptAfterEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16496 }
16497 // Remove charge (aura can be removed by triggers)
16498 // xinef: take into account attribute6 of proc spell
16499 if (prepare && useCharges && takeCharges)
16500 if (!procSpellInfo || isVictim || !procSpellInfo->HasAttribute(SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES))
16501 i->aura->DropCharge();
16502
16503 i->aura->CallScriptAfterProcHandlers(aurApp, eventInfo);
16504
16506 SetCantProc(false);
16507 }
16508
16509 // Cleanup proc requirements
16511 SetCantProc(false);
16512}
@ EFFECT_2
Definition: SharedDefines.h:33
@ SPELL_ATTR3_INSTANT_TARGET_PROCS
Definition: SharedDefines.h:512
#define EFFECT_ALL
Definition: SharedDefines.h:38
@ SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES
Definition: SharedDefines.h:609
@ SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE
Definition: SpellAuraDefines.h:288
@ SPELL_AURA_ADD_PCT_MODIFIER
Definition: SpellAuraDefines.h:171
@ SPELL_AURA_OBS_MOD_POWER
Definition: SpellAuraDefines.h:84
@ SPELL_AURA_ADD_FLAT_MODIFIER
Definition: SpellAuraDefines.h:170
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE
Definition: SpellAuraDefines.h:120
@ SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT
Definition: SpellAuraDefines.h:135
@ SPELL_AURA_MOD_POWER_COST_SCHOOL
Definition: SpellAuraDefines.h:136
@ SPELL_AURA_MECHANIC_IMMUNITY
Definition: SpellAuraDefines.h:140
@ SPELL_AURA_RAID_PROC_FROM_CHARGE
Definition: SpellAuraDefines.h:286
@ SPELL_AURA_PROC_TRIGGER_DAMAGE
Definition: SpellAuraDefines.h:106
@ SPELL_AURA_REFLECT_SPELLS_SCHOOL
Definition: SpellAuraDefines.h:137
@ SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK
Definition: SpellAuraDefines.h:128
@ PROC_HIT_CRITICAL
Definition: SpellMgr.h:253
#define MELEE_BASED_TRIGGER_MASK
Definition: SpellMgr.h:182
@ PROC_EX_INTERNAL_CANT_PROC
Definition: SpellMgr.h:218
@ PROC_EX_INTERNAL_TRIGGERED
Definition: SpellMgr.h:221
@ PROC_FLAG_DONE_PERIODIC
Definition: SpellMgr.h:134
@ REACTIVE_OVERPOWER
Definition: Unit.h:590
@ REACTIVE_DEFENSE
Definition: Unit.h:588
@ REACTIVE_HUNTER_PARRY
Definition: Unit.h:589
@ REACTIVE_WOLVERINE_BITE
Definition: Unit.h:591
static bool isNonTriggerAura[TOTAL_AURAS]
Definition: Unit.cpp:104
static bool isTriggerAura[TOTAL_AURAS]
Definition: Unit.cpp:102
std::list< ProcTriggeredData > ProcTriggeredList
Definition: Unit.cpp:15855
@ CONDITION_SOURCE_TYPE_SPELL_PROC
Definition: ConditionMgr.h:147
void UpdateCombatSkills(Unit *victim, WeaponAttackType attType, bool defence, Item *item=nullptr)
Definition: PlayerUpdates.cpp:981
Definition: Unit.cpp:15836
Definition: Unit.h:420
void SetProcCooldown(uint32 cooldown)
Definition: Unit.h:454
Unit * GetActionTarget() const
Definition: Unit.h:440
Unit * GetProcTarget() const
Definition: Unit.h:441
bool HandleProcTriggerSpell(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
Definition: Unit.cpp:8934
bool HandleAuraRaidProcFromChargeWithValue(AuraEffect *triggeredByAura)
Definition: Unit.cpp:17563
bool IsHunterPet() const
Definition: Unit.h:755
bool IsTriggeredAtSpellProcEvent(Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
Definition: Unit.cpp:17424
bool HandleAuraProc(Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
Definition: Unit.cpp:8739
virtual bool HasSpellItemCooldown(uint32, uint32) const
Definition: Unit.h:1261
bool HandleDummyAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
Definition: Unit.cpp:6589
void StartReactiveTimer(ReactiveType reactive)
Definition: Unit.h:1715
bool HandleOverrideClassScriptAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
Definition: Unit.cpp:9861
bool HandleAuraRaidProcFromCharge(AuraEffect *triggeredByAura)
Definition: Unit.cpp:17652
bool IsCharmedOwnedByPlayerOrPlayer() const
Definition: Unit.h:1234
void HandleProcTriggerDamageAuraProc(AuraApplication *aurApp, ProcEventInfo &eventInfo)
Definition: SpellAuraEffects.cpp:7257
SpellModifier * GetSpellModifier() const
Definition: SpellAuraEffects.h:52
Unit * GetUnitOwner() const
Definition: SpellAuras.h:108

References AddComboPoints(), ASSERT, ProcTriggeredData::aura, AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, SpellInfo::CalcCastTime(), Aura::CallScriptAfterCheckProcHandlers(), Aura::CallScriptCheckProcHandlers(), CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_ROGUE, CLASS_WARRIOR, CONDITION_SOURCE_TYPE_SPELL_PROC, EFFECT_0, EFFECT_1, EFFECT_2, EFFECT_ALL, SpellInfo::Effects, ProcTriggeredData::effMask, FORM_GHOSTWOLF, ProcEventInfo::GetActionTarget(), ProcEventInfo::GetActor(), AuraEffect::GetAmount(), GetAppliedAuras(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), AuraEffect::GetCasterGUID(), Aura::GetEffect(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), ProcEventInfo::GetProcTarget(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), AuraEffect::GetSpellModifier(), Aura::GetUnitOwner(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandleProcTriggerDamageAuraProc(), HandleProcTriggerSpell(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasSpellItemCooldown(), SpellInfo::Id, IsCharmedOwnedByPlayerOrPlayer(), IsClass(), IsHunterPet(), isNonTriggerAura, Object::IsPlayer(), isTriggerAura, IsTriggeredAtSpellProcEvent(), LOG_DEBUG, Spell::m_appliedMods, Spell::m_weaponItem, SpellInfo::ManaCost, SpellInfo::ManaCostPercentage, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, MELEE_BASED_TRIGGER_MASK, ModifyAuraState(), PROC_EX_ABSORB, PROC_EX_BLOCK, PROC_EX_CRITICAL_HIT, PROC_EX_DODGE, PROC_EX_INTERNAL_CANT_PROC, PROC_EX_INTERNAL_TRIGGERED, PROC_EX_MISS, PROC_EX_NORMAL_HIT, PROC_EX_PARRY, PROC_EX_RESIST, PROC_FLAG_DONE_PERIODIC, PROC_HIT_CRITICAL, PROC_SPELL_PHASE_HIT, REACTIVE_DEFENSE, REACTIVE_HUNTER_PARRY, REACTIVE_OVERPOWER, REACTIVE_WOLVERINE_BITE, SpellInfo::SchoolMask, sConditionMgr, AuraEffect::SetAmount(), SetCantProc(), ProcEventInfo::SetProcCooldown(), SPELL_ATTR3_INSTANT_TARGET_PROCS, SPELL_ATTR4_REACTIVE_DAMAGE_PROC, SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES, SPELL_AURA_ABILITY_IGNORE_AURASTATE, SPELL_AURA_ADD_FLAT_MODIFIER, SPELL_AURA_ADD_PCT_MODIFIER, SPELL_AURA_DUMMY, SPELL_AURA_MANA_SHIELD, SPELL_AURA_MECHANIC_IMMUNITY, SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_MECHANIC_RESISTANCE, SPELL_AURA_MOD_MELEE_HASTE, SPELL_AURA_MOD_POWER_COST_SCHOOL, SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_STUN, SPELL_AURA_OBS_MOD_POWER, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PROC_TRIGGER_DAMAGE, SPELL_AURA_PROC_TRIGGER_SPELL, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE, SPELL_AURA_RAID_PROC_FROM_CHARGE, SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_AURA_SPELL_MAGNET, SPELL_AURA_TRANSFORM, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, ProcTriggeredData::spellProcEvent, StartReactiveTimer(), Object::ToPlayer(), Object::ToUnit(), ProcTriggeredData::triggerSpelId, and Player::UpdateCombatSkills().

Referenced by CalcAbsorbResist(), and ProcDamageAndSpell().

◆ processDummyAuras()

float Unit::processDummyAuras ( float  TakenTotalMod) const
private
11903{
11904 // note: old code coming from TC, just extracted here to remove the code duplication + solve potential crash
11905 // see: https://github.com/TrinityCore/TrinityCore/commit/c85710e148d75450baedf6632b9ca6fd40b4148e
11906
11907 // .. taken pct: dummy auras
11908 auto const& mDummyAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
11909 for (auto i = mDummyAuras.begin(); i != mDummyAuras.end(); ++i)
11910 {
11911 if (!(*i) || !(*i)->GetSpellInfo())
11912 {
11913 continue;
11914 }
11915
11916 if (auto spellIconId = (*i)->GetSpellInfo()->SpellIconID)
11917 {
11918 switch (spellIconId)
11919 {
11920 // Cheat Death
11921 case 2109:
11922 if ((*i)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
11923 {
11924 // Patch 2.4.3: The resilience required to reach the 90% damage reduction cap
11925 // is 22.5% critical strike damage reduction, or 444 resilience.
11926 // To calculate for 90%, we multiply the 100% by 4 (22.5% * 4 = 90%)
11927 float mod = -1.0f * GetMeleeCritDamageReduction(400);
11928 AddPct(TakenTotalMod, std::max(mod, float((*i)->GetAmount())));
11929 }
11930 break;
11931 }
11932 }
11933 }
11934 return TakenTotalMod;
11935}

References AddPct(), GetAuraEffectsByType(), GetMeleeCritDamageReduction(), SPELL_AURA_DUMMY, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by MeleeDamageBonusTaken(), and SpellDamageBonusTaken().

◆ ProcessPositionDataChanged()

void Unit::ProcessPositionDataChanged ( PositionFullTerrainStatus const &  data)
overridevirtual

Reimplemented from WorldObject.

4255{
4258}
virtual void ProcessPositionDataChanged(PositionFullTerrainStatus const &data)
Definition: Object.cpp:1163
virtual void ProcessTerrainStatusUpdate()
Definition: Unit.cpp:4260

References WorldObject::ProcessPositionDataChanged(), and ProcessTerrainStatusUpdate().

Referenced by Creature::Create().

◆ ProcessTerrainStatusUpdate()

void Unit::ProcessTerrainStatusUpdate ( )
virtual

Reimplemented in Player.

4261{
4262 if (IsCreature())
4264
4265 if (IsFlying() || (!IsControlledByPlayer()))
4266 return;
4267
4268 LiquidData const& liquidData = GetLiquidData();
4269
4270 // remove appropriate auras if we are swimming/not swimming respectively
4271 if (liquidData.Status & MAP_LIQUID_STATUS_SWIMMING)
4273 else if (!isSwimming())
4275
4276 // liquid aura handling
4277 LiquidTypeEntry const* curLiquid = nullptr;
4278 if ((liquidData.Status & MAP_LIQUID_STATUS_SWIMMING))
4279 curLiquid = sLiquidTypeStore.LookupEntry(liquidData.Entry);
4280
4281 if (curLiquid != _lastLiquid)
4282 {
4285
4286 // Set _lastLiquid before casting liquid spell to avoid infinite loops
4287 _lastLiquid = curLiquid;
4288
4290 if (curLiquid && curLiquid->SpellId && (!player || !player->IsGameMaster()))
4291 CastSpell(this, curLiquid->SpellId, true);
4292 }
4293}
@ AURA_INTERRUPT_FLAG_NOT_ABOVEWATER
Definition: SpellDefines.h:50
@ AURA_INTERRUPT_FLAG_NOT_UNDERWATER
Definition: SpellDefines.h:51
DBCStorage< LiquidTypeEntry > sLiquidTypeStore(LiquidTypefmt)
void UpdateMovementFlags()
Definition: Creature.cpp:3436
bool isSwimming() const
Definition: Unit.h:1578
bool IsFlying() const
Definition: Unit.h:1580
Definition: Map.h:169
uint32 Entry
Definition: Map.h:172
Definition: DBCStructure.h:1282
uint32 SpellId
Definition: DBCStructure.h:1288

References _lastLiquid, AURA_INTERRUPT_FLAG_NOT_ABOVEWATER, AURA_INTERRUPT_FLAG_NOT_UNDERWATER, CastSpell(), LiquidData::Entry, GetCharmerOrOwnerPlayerOrPlayerItself(), WorldObject::GetLiquidData(), IsControlledByPlayer(), Object::IsCreature(), IsFlying(), Player::IsGameMaster(), isSwimming(), MAP_LIQUID_STATUS_SWIMMING, RemoveAurasDueToSpell(), RemoveAurasWithInterruptFlags(), sLiquidTypeStore, LiquidTypeEntry::SpellId, LiquidData::Status, Object::ToCreature(), and Creature::UpdateMovementFlags().

Referenced by ProcessPositionDataChanged(), and Player::ProcessTerrainStatusUpdate().

◆ ProhibitSpellSchool()

virtual void Unit::ProhibitSpellSchool ( SpellSchoolMask  ,
uint32   
)
inlinevirtual

Reimplemented in Creature, and Player.

1456{ }

Referenced by Spell::EffectInterruptCast().

◆ propagateSpeedChange()

void Unit::propagateSpeedChange ( )
inline
void propagateSpeedChange()
Definition: MotionMaster.cpp:890

References GetMotionMaster(), and MotionMaster::propagateSpeedChange().

Referenced by SetSpeed(), and SetWalk().

◆ RecalculateObjectScale()

void Unit::RecalculateObjectScale ( )
virtual
16756{
16758 float scale = GetNativeObjectScale() + CalculatePct(1.0f, scaleAuras);
16759 float scaleMin = IsPlayer() ? 0.1f : 0.01f;
16760 SetObjectScale(std::max(scale, scaleMin));
16761}
@ SPELL_AURA_MOD_SCALE_2
Definition: SpellAuraDefines.h:302
@ SPELL_AURA_MOD_SCALE
Definition: SpellAuraDefines.h:124
virtual void SetObjectScale(float scale)
Definition: Object.h:116
virtual float GetNativeObjectScale() const
Definition: Unit.h:1835

References CalculatePct(), GetNativeObjectScale(), GetTotalAuraModifier(), Object::IsPlayer(), Object::SetObjectScale(), SPELL_AURA_MOD_SCALE, and SPELL_AURA_MOD_SCALE_2.

Referenced by AuraEffect::HandleAuraModScale().

◆ RemoveAllAttackers()

void Unit::RemoveAllAttackers ( )

Remove all units in m_attackers list and send them AttackStop()

10485{
10486 while (!m_attackers.empty())
10487 {
10488 AttackerSet::iterator iter = m_attackers.begin();
10489 if (!(*iter)->AttackStop())
10490 {
10491 LOG_ERROR("entities.unit", "WORLD: Unit has an attacker that isn't attacking it!");
10492 m_attackers.erase(iter);
10493 }
10494 }
10495}

References LOG_ERROR, and m_attackers.

Referenced by CombatStop(), Spell::EffectSanctuary(), boss_kaelthas::ExecuteMiddleEvent(), AuraEffect::HandleFeignDeath(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), and npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI().

◆ RemoveAllAuras()

void Unit::RemoveAllAuras ( )
5320{
5321 // this may be a dead loop if some events on aura remove will continiously apply aura on remove
5322 // we want to have all auras removed, so use your brain when linking events
5323 while (!m_appliedAuras.empty() || !m_ownedAuras.empty())
5324 {
5325 AuraApplicationMap::iterator aurAppIter;
5326 for (aurAppIter = m_appliedAuras.begin(); aurAppIter != m_appliedAuras.end();)
5328
5329 AuraMap::iterator aurIter;
5330 for (aurIter = m_ownedAuras.begin(); aurIter != m_ownedAuras.end();)
5331 RemoveOwnedAura(aurIter);
5332 }
5333}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by CleanupBeforeRemoveFromMap(), npc_mograine::npc_mograineAI::DamageTaken(), boss_muru::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), spell_rotface_unstable_ooze_explosion_suicide_aura::DespawnSelf(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_taldaram::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), boss_leotheras_the_blind::DoAction(), boss_kalecgos::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::DoAction(), npc_taretha::npc_tarethaAI::DoAction(), boss_razorgore::boss_razorgoreAI::DoChangePhase(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), boss_mimiron::boss_mimironAI::EnterEvadeMode(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::EnterEvadeMode(), npc_ulduar_vx001::npc_ulduar_vx001AI::EnterEvadeMode(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), LichKingDeathEvent::Execute(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::FinishQuest(), spell_herald_volzaj_insanity::HandleDummyEffect(), misc_commandscript::HandleUnAuraCommand(), boss_ick::boss_ickAI::JustDied(), boss_venoxis::JustDied(), boss_taldaram::JustEngagedWith(), boss_mimiron::boss_mimironAI::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_commander_stoutbeard::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_steelbreaker::boss_steelbreakerAI::JustReachedHome(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustReachedHome(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustReachedHome(), boss_urom::boss_uromAI::LeaveCombat(), boss_taldaram::MovementInform(), npc_hallows_end_soh::MovementInform(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::MovementInform(), spell_kaelthas_flame_strike::OnRemove(), PretendToDie(), boss_alar::PretendToDie(), Creature::RemoveCorpse(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::Reset(), boss_venoxis::Reset(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_bjarngrim::boss_bjarngrimAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_hodir::boss_hodirAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_skadi::boss_skadiAI::Reset(), boss_skadi_grauf::boss_skadi_graufAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), Pet::SavePetToDB(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), npc_harrison_jones::SpellHit(), npc_frost_sphere::npc_frost_sphereAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_soh_fire_trigger::SpellHit(), npc_hallows_end_train_fire::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::UpdateAI(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_magus_telestra::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), and npc_aeranas::npc_aeranasAI::UpdateAI().

◆ RemoveAllAurasExceptType()

void Unit::RemoveAllAurasExceptType ( AuraType  type)
5394{
5395 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5396 {
5397 Aura const* aura = iter->second->GetBase();
5398 if (aura->GetSpellInfo()->HasAura(type))
5399 ++iter;
5400 else
5402 }
5403
5404 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5405 {
5406 Aura* aura = iter->second;
5407 if (aura->GetSpellInfo()->HasAura(type))
5408 ++iter;
5409 else
5411 }
5412}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, Aura::GetSpellInfo(), SpellInfo::HasAura(), m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), and npc_iron_watcher::npc_iron_watcherAI::SpellHit().

◆ RemoveAllAurasOnDeath()

void Unit::RemoveAllAurasOnDeath ( )
5350{
5351 // used just after dieing to remove all visible auras
5352 // and disable the mods for the passive ones
5353 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5354 {
5355 Aura const* aura = iter->second->GetBase();
5358 else
5359 ++iter;
5360 }
5361
5362 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5363 {
5364 Aura* aura = iter->second;
5367 else
5368 ++iter;
5369 }
5370}
@ SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD
Definition: SharedDefines.h:643
@ AURA_REMOVE_BY_DEATH
Definition: SpellAuraDefines.h:396
bool IsDeathPersistent() const
Definition: SpellAuras.cpp:1087

References _UnapplyAura(), AURA_REMOVE_BY_DEATH, Aura::GetSpellInfo(), SpellInfo::HasAttribute(), Aura::IsDeathPersistent(), Aura::IsPassive(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), and SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD.

Referenced by spell_dk_death_pact::FilterTargets(), Kill(), Player::LoadFromDB(), and setDeathState().

◆ RemoveAllAurasRequiringDeadTarget()

void Unit::RemoveAllAurasRequiringDeadTarget ( )
5373{
5374 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5375 {
5376 Aura const* aura = iter->second->GetBase();
5377 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5379 else
5380 ++iter;
5381 }
5382
5383 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5384 {
5385 Aura* aura = iter->second;
5386 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5388 else
5389 ++iter;
5390 }
5391}
bool IsRequiringDeadTarget() const
Definition: SpellInfo.cpp:1222

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, Aura::GetSpellInfo(), Aura::IsPassive(), SpellInfo::IsRequiringDeadTarget(), m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by Player::LoadFromDB().

◆ RemoveAllControlled()

void Unit::RemoveAllControlled ( bool  onDeath = false)
11087{
11088 // possessed pet and vehicle
11089 if (IsPlayer())
11091
11092 while (!m_Controlled.empty())
11093 {
11094 Unit* target = *m_Controlled.begin();
11095 m_Controlled.erase(m_Controlled.begin());
11096 if (target->GetCharmerGUID() == GetGUID())
11097 {
11098 target->RemoveCharmAuras();
11099 }
11100 else if (target->GetOwnerGUID() == GetGUID() && target->IsSummon())
11101 {
11102 if (!(onDeath && !IsPlayer() && target->IsGuardian()))
11103 {
11104 target->ToTempSummon()->UnSummon();
11105 }
11106 }
11107 else
11108 {
11109 LOG_ERROR("entities.unit", "Unit {} is trying to release unit {} which is neither charmed nor owned by it", GetEntry(), target->GetEntry());
11110 }
11111 }
11112}
void StopCastingCharm(Aura *except=nullptr)
Definition: Player.cpp:9304
bool IsGuardian() const
Definition: Unit.h:752
void RemoveCharmAuras()
Definition: Unit.cpp:11197

References GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), IsGuardian(), Object::IsPlayer(), IsSummon(), LOG_ERROR, m_Controlled, RemoveCharmAuras(), Player::StopCastingCharm(), Object::ToPlayer(), ToTempSummon(), and TempSummon::UnSummon().

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ RemoveAllDynObjects()

void Unit::RemoveAllDynObjects ( )
6164{
6165 while (!m_dynObj.empty())
6166 m_dynObj.front()->Remove();
6167}

References m_dynObj.

Referenced by RemoveFromWorld(), Player::TeleportTo(), and npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI().

◆ RemoveAllGameObjects()

void Unit::RemoveAllGameObjects ( )
6264{
6265 while(!m_gameObj.empty())
6266 {
6267 GameObject* go = ObjectAccessor::GetGameObject(*this, *m_gameObj.begin());
6268 if (go)
6269 {
6271 go->SetRespawnTime(0);
6272 go->Delete();
6273 }
6274 m_gameObj.erase(m_gameObj.begin());
6275 }
6276}
void Delete()
Definition: GameObject.cpp:979
void SetRespawnTime(int32 respawn)
Definition: GameObject.cpp:1303

References GameObject::Delete(), ObjectGuid::Empty, ObjectAccessor::GetGameObject(), m_gameObj, GameObject::SetOwnerGUID(), and GameObject::SetRespawnTime().

Referenced by CleanupBeforeRemoveFromMap(), npc_ice_tomb::npc_ice_tombAI::JustDied(), RemoveFromWorld(), npc_brewfest_super_brew_trigger::UpdateAI(), and boss_sapphiron::boss_sapphironAI::UpdateAI().

◆ RemoveAllMinionsByEntry()

void Unit::RemoveAllMinionsByEntry ( uint32  entry)
10864{
10865 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
10866 {
10867 Unit* unit = *itr;
10868 ++itr;
10869 if (unit->GetEntry() == entry && unit->IsCreature()
10870 && unit->ToCreature()->IsSummon()) // minion, actually
10871 unit->ToTempSummon()->UnSummon();
10872 // i think this is safe because i have never heard that a despawned minion will trigger a same minion
10873 }
10874}

References Object::GetEntry(), Object::IsCreature(), IsSummon(), m_Controlled, Object::ToCreature(), ToTempSummon(), and TempSummon::UnSummon().

Referenced by Player::ApplyEquipSpell(), Spell::EffectSummonType(), npc_nelson::npc_nelsonAI::Reset(), SetMinion(), and npc_nelson::npc_nelsonAI::UpdateAI().

◆ RemoveAppliedAuras() [1/2]

void Unit::RemoveAppliedAuras ( std::function< bool(AuraApplication const *)> const &  check)
4871{
4872 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
4873 {
4874 if (check(iter->second))
4875 {
4876 RemoveAura(iter);
4877 continue;
4878 }
4879 ++iter;
4880 }
4881}

References m_appliedAuras, and RemoveAura().

Referenced by RemoveArenaAuras().

◆ RemoveAppliedAuras() [2/2]

void Unit::RemoveAppliedAuras ( uint32  spellId,
std::function< bool(AuraApplication const *)> const &  check 
)
4897{
4898 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
4899 {
4900 if (check(iter->second))
4901 {
4902 RemoveAura(iter);
4903 continue;
4904 }
4905 ++iter;
4906 }
4907}

References m_appliedAuras, and RemoveAura().

◆ RemoveAreaAurasDueToLeaveWorld()

void Unit::RemoveAreaAurasDueToLeaveWorld ( )
5287{
5288 // make sure that all area auras not applied on self are removed - prevent access to deleted pointer later
5289 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5290 {
5291 Aura* aura = iter->second;
5292 ++iter;
5293 Aura::ApplicationMap const& appMap = aura->GetApplicationMap();
5294 for (Aura::ApplicationMap::const_iterator itr = appMap.begin(); itr != appMap.end();)
5295 {
5296 AuraApplication* aurApp = itr->second;
5297 ++itr;
5298 Unit* target = aurApp->GetTarget();
5299 if (target == this)
5300 continue;
5301 target->RemoveAura(aurApp);
5302 // things linked on aura remove may apply new area aura - so start from the beginning
5303 iter = m_ownedAuras.begin();
5304 }
5305 }
5306
5307 // remove area auras owned by others
5308 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5309 {
5310 if (iter->second->GetBase()->GetOwner() != this)
5311 {
5312 RemoveAura(iter);
5313 }
5314 else
5315 ++iter;
5316 }
5317}
ApplicationMap const & GetApplicationMap()
Definition: SpellAuras.h:181
std::map< ObjectGuid, AuraApplication * > ApplicationMap
Definition: SpellAuras.h:90

References Aura::GetApplicationMap(), AuraApplication::GetTarget(), m_appliedAuras, m_ownedAuras, and RemoveAura().

Referenced by RemoveFromWorld().

◆ RemoveArenaAuras()

void Unit::RemoveArenaAuras ( )
5336{
5337 // in join, remove positive buffs, on end, remove negative
5338 // used to remove positive visible auras in arenas
5339 RemoveAppliedAuras([](AuraApplication const* aurApp)
5340 {
5341 Aura const* aura = aurApp->GetBase();
5342 return (!aura->GetSpellInfo()->HasAttribute(SPELL_ATTR4_ALLOW_ENETRING_ARENA) // don't remove stances, shadowform, pally/hunter auras
5343 && !aura->IsPassive() // don't remove passive auras
5344 && (aurApp->IsPositive() || !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD))) || // not negative death persistent auras
5345 aura->GetSpellInfo()->HasAttribute(SPELL_ATTR5_REMOVE_ENTERING_ARENA); // special marker, always remove
5346 });
5347}
@ SPELL_ATTR5_REMOVE_ENTERING_ARENA
Definition: SharedDefines.h:569
@ SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD
Definition: SharedDefines.h:513
@ SPELL_ATTR4_ALLOW_ENETRING_ARENA
Definition: SharedDefines.h:551
void RemoveAppliedAuras(std::function< bool(AuraApplication const *)> const &check)
Definition: Unit.cpp:4870
bool IsPositive() const
Definition: SpellAuras.h:68

References AuraApplication::GetBase(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), Aura::IsPassive(), AuraApplication::IsPositive(), RemoveAppliedAuras(), SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD, SPELL_ATTR4_ALLOW_ENETRING_ARENA, and SPELL_ATTR5_REMOVE_ENTERING_ARENA.

Referenced by Player::TeleportTo().

◆ RemoveAura() [1/4]

void Unit::RemoveAura ( Aura aur,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4850{
4851 if (aura->IsRemoved())
4852 return;
4853 if (AuraApplication* aurApp = aura->GetApplicationOfTarget(GetGUID()))
4854 RemoveAura(aurApp, mode);
4855}

References Aura::GetApplicationOfTarget(), Object::GetGUID(), Aura::IsRemoved(), and RemoveAura().

◆ RemoveAura() [2/4]

void Unit::RemoveAura ( AuraApplication aurApp,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4807{
4808 // we've special situation here, RemoveAura called while during aura removal
4809 // this kind of call is needed only when aura effect removal handler
4810 // or event triggered by it expects to remove
4811 // not yet removed effects of an aura
4812 if (aurApp->GetRemoveMode())
4813 {
4814 // remove remaining effects of an aura
4815 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4816 {
4817 if (aurApp->HasEffect(itr))
4818 aurApp->_HandleEffect(itr, false);
4819 }
4820 return;
4821 }
4822 // no need to remove
4823 if (aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) != aurApp || aurApp->GetBase()->IsRemoved())
4824 return;
4825
4826 uint32 spellId = aurApp->GetBase()->GetId();
4827 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4828
4829 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4830 {
4831 if (aurApp == iter->second)
4832 {
4833 // Prevent Arena Preparation aura from being removed by player actions
4834 // It's an invisibility spell so any interaction/spell cast etc. removes it.
4835 // Should only be removed by the arena script, once the match starts.
4837 {
4838 return;
4839 }
4840
4841 RemoveAura(iter, mode);
4842 return;
4843 }
4844 else
4845 ++iter;
4846 }
4847}
@ SPELL_AURA_ARENA_PREPARATION
Definition: SpellAuraDefines.h:278

References AuraApplication::_HandleEffect(), Aura::GetApplicationOfTarget(), AuraApplication::GetBase(), Object::GetGUID(), Aura::GetId(), AuraApplication::GetRemoveMode(), AuraApplication::HasEffect(), Aura::HasEffectType(), Aura::IsRemoved(), m_appliedAuras, MAX_SPELL_EFFECTS, RemoveAura(), and SPELL_AURA_ARENA_PREPARATION.

◆ RemoveAura() [3/4]

void Unit::RemoveAura ( AuraApplicationMap::iterator &  i,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4777{
4778 AuraApplication* aurApp = i->second;
4779 // Do not remove aura which is already being removed
4780 if (aurApp->GetRemoveMode())
4781 return;
4782 Aura* aura = aurApp->GetBase();
4783 _UnapplyAura(i, mode);
4784 // Remove aura - for Area and Target auras
4785 if (aura->GetOwner() == this)
4786 aura->Remove(mode);
4787}

References _UnapplyAura(), AuraApplication::GetBase(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), and Aura::Remove().

Referenced by _RemoveNoStackAurasDueToAura(), boss_marli::_schedulePhaseTroll(), ApplySpellDispelImmunity(), Player::CheckAreaExploreAndOutdoor(), boss_headless_horseman::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_hor_lich_king::npc_hor_lich_kingAI::DoAction(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), npc_harrison_jones::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_pilgrims_bounty_chair::DoAction(), boss_paletress::boss_paletressAI::DoAction(), boss_vezax::boss_vezaxAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DoAction(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::DoAction(), boss_yoggsaron_constrictor_tentacle::boss_yoggsaron_constrictor_tentacleAI::DoAction(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), Player::DuelComplete(), Spell::EffectDispelMechanic(), Spell::EffectForceCast(), Spell::EffectHeal(), Spell::EffectSummonPet(), Spell::EffectTriggerSpell(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), GetDiseasesByCaster(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModSchoolImmunity(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_q12096_q12092_bark::HandleDummy(), HandleDummyAuraProc(), spell_valanar_kinetic_bomb_aura::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_midsummer_ribbon_pole::HandleEffectPeriodic(), spell_dk_improved_blood_presence::HandleEffectRemove(), spell_dk_improved_frost_presence::HandleEffectRemove(), spell_dk_improved_unholy_presence::HandleEffectRemove(), spell_dk_presence::HandleEffectRemove(), spell_pal_blessing_of_sanctuary::HandleEffectRemove(), spell_sha_chain_heal::HandleHeal(), spell_sindragosa_frost_breath::HandleInfusion(), spell_warl_demonic_circle_summon::HandleRemove(), spell_putricide_eat_ooze::HandleScript(), AuraEffect::HandleShapeshiftBoosts(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_jaraxxus::boss_jaraxxusAI::JustEngagedWith(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::JustEngagedWith(), npc_ulduar_snow_mound::MoveInLineOfSight(), spell_blood_queen_vampiric_bite::OnCast(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), npc_essence_of_twin::OnGossipHello(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), npc_thrall_bfu::OnQuestReward(), npc_vortex_ride::npc_vortex_rideAI::PassengerBoarded(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::PassengerBoarded(), npc_eastvale_peasent::PathEndReached(), BattlefieldWG::PromotePlayer(), RemoveAppliedAuras(), RemoveAreaAurasDueToLeaveWorld(), RemoveAura(), RemoveAurasByShapeShift(), RemoveAurasByType(), RemoveAurasDueToItemSpell(), RemoveAurasDueToSpell(), RemoveAurasWithAttribute(), RemoveAurasWithFamily(), RemoveAurasWithInterruptFlags(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), BattlegroundIC::RemovePlayer(), BattlegroundMap::RemovePlayerFromMap(), boss_bjarngrim::boss_bjarngrimAI::RemoveStanceAura(), boss_gyth::boss_gythAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_marli::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_varos::boss_varosAI::Reset(), NPCStaveQuestAI::ResetState(), boss_anomalus::SetData(), boss_hodir::boss_hodirAI::SmallIcicles(), boss_malygos::boss_malygosAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), boss_headless_horseman::SpellHit(), boss_viscidus::SpellHit(), spell_pal_hand_of_sacrifice_aura::Split(), boss_sartharion_shadron::boss_sartharion_shadronAI::SummonedCreatureDies(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), boss_viscidus::UpdateAI(), boss_taldaram::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), Spell::UpdateChanneledTargetList(), and boss_bjarngrim::boss_bjarngrimAI::WaypointReached().

◆ RemoveAura() [4/4]

void Unit::RemoveAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4790{
4791 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4792 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4793 {
4794 Aura const* aura = iter->second->GetBase();
4795 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
4796 && (!caster || aura->GetCasterGUID() == caster))
4797 {
4798 RemoveAura(iter, removeMode);
4799 return;
4800 }
4801 else
4802 ++iter;
4803 }
4804}

References Aura::GetCasterGUID(), Aura::GetEffectMask(), m_appliedAuras, and RemoveAura().

◆ RemoveAuraFromStack()

void Unit::RemoveAuraFromStack ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4926{
4927 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4928 for (AuraMap::iterator iter = range.first; iter != range.second;)
4929 {
4930 Aura* aura = iter->second;
4931 if ((aura->GetType() == UNIT_AURA_TYPE)
4932 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
4933 {
4934 aura->ModStackAmount(-1, removeMode);
4935 return;
4936 }
4937 else
4938 ++iter;
4939 }
4940}
@ UNIT_AURA_TYPE
Definition: SpellAuraDefines.h:385
bool ModStackAmount(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT, bool periodicReset=false)
Definition: SpellAuras.cpp:1021
AuraObjectType GetType() const
Definition: SpellAuras.cpp:481

References Aura::GetCasterGUID(), Aura::GetType(), m_ownedAuras, Aura::ModStackAmount(), and UNIT_AURA_TYPE.

Referenced by Spell::EffectSchoolDMG(), HandleAuraProc(), HandleDummyAuraProc(), spell_putricide_gaseous_bloat_aura::HandleExtraEffect(), spell_oculus_evasive_maneuvers_aura::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_item_brittle_armor::HandleScript(), spell_item_mercurial_shield::HandleScript(), boss_selin_fireheart::JustEngagedWith(), and boss_viscidus::SpellHit().

◆ RemoveAurasByShapeShift()

void Unit::RemoveAurasByShapeShift ( )
5271{
5272 uint32 mechanic_mask = (1 << MECHANIC_SNARE) | (1 << MECHANIC_ROOT);
5273 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5274 {
5275 Aura const* aura = iter->second->GetBase();
5276 if ((aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask) &&
5278 {
5279 RemoveAura(iter);
5280 continue;
5281 }
5282 ++iter;
5283 }
5284}
@ SPELL_ATTR0_CU_AURA_CC
Definition: SpellInfo.h:181
uint32 GetAllEffectsMechanicMask() const
Definition: SpellInfo.cpp:1992

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), m_appliedAuras, MECHANIC_ROOT, MECHANIC_SNARE, RemoveAura(), SPELL_ATTR0_CU_AURA_CC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by AuraEffect::HandleAuraModShapeshift().

◆ RemoveAurasByType()

void Unit::RemoveAurasByType ( AuraType  auraType,
ObjectGuid  casterGUID = ObjectGuid::Empty,
Aura except = nullptr,
bool  negative = true,
bool  positive = true 
)
5111{
5112 // simple check if list is empty
5113 if (m_modAuras[auraType].empty())
5114 return;
5115
5116 for (AuraEffectList::iterator iter = m_modAuras[auraType].begin(); iter != m_modAuras[auraType].end();)
5117 {
5118 Aura* aura = (*iter)->GetBase();
5120
5121 ++iter;
5122 if (aura != except && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5123 && ((negative && !aurApp->IsPositive()) || (positive && aurApp->IsPositive())))
5124 {
5125 uint32 removedAuras = m_removedAurasCount;
5126 RemoveAura(aurApp);
5127 if (m_removedAurasCount > removedAuras + 1)
5128 iter = m_modAuras[auraType].begin();
5129 }
5130 }
5131}

References Aura::GetApplicationOfTarget(), Aura::GetCasterGUID(), Object::GetGUID(), AuraApplication::IsPositive(), m_modAuras, m_removedAurasCount, and RemoveAura().

Referenced by _EnterVehicle(), Spell::_handle_finish_phase(), Player::ActivateTaxiPathTo(), Battleground::AddPlayer(), Attack(), spell_gen_summon_tournament_mount::CheckIfLanceEquipped(), ClearComboPoints(), Player::ContinueTaxiFlight(), boss_kologarn_arms::boss_kologarn_armsAI::DamageTaken(), Spell::DoSpellHitOnUnit(), Spell::EffectPowerBurn(), Spell::EffectTriggerSpell(), BattlegroundWS::EventPlayerClickedOnFlag(), ExitVehicle(), WorldSession::HandleAuctionHelloOpcode(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItemsEvent(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), spell_warl_seduction::HandleAuraApply(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraModStateImmunity(), AuraEffect::HandleAuraMounted(), AuraEffect::HandleAuraTransform(), WorldSession::HandleBankerActivateOpcode(), WorldSession::HandleBinderActivateOpcode(), WorldSession::HandleBuybackItem(), WorldSession::HandleBuyStableSlot(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), spell_item_reindeer_transformation::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), HandleDummyAuraProc(), spell_rog_vanish::HandleEffect(), spell_hydross_mark_of_hydross::HandleEffectApply(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandleListStabledPetsOpcode(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), WorldSession::HandleMoveWorldportAck(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_algalon_remove_phase_aura::HandlePeriodic(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::HandleRepairItemOpcode(), WorldSession::HandleSaveGuildEmblemOpcode(), spell_gen_mine_sweeper::HandleSchoolDMG(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSpiritHealerActivateOpcode(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleTabardVendorActivateOpcode(), WorldSession::HandleTalentWipeConfirmOpcode(), WorldSession::HandleTaxiQueryAvailableNodes(), WorldSession::HandleTrainerBuySpellOpcode(), WorldSession::HandleUnstablePet(), boss_gurtogg_bloodboil::JustEngagedWith(), Player::LeaveBattleground(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), spell_gen_aura_service_uniform::OnApply(), Player::ProcessDelayedOperations(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), Vehicle::RemoveAllPassengers(), RemoveBindSightAuras(), RemoveCharmAuras(), Battleground::RemovePlayerAtLeave(), WorldSession::SendDoFlight(), WorldSession::SendListInventory(), Player::SendLoot(), WorldSession::SendTrainerList(), SetCharmedBy(), Player::StopCastingCharm(), Player::TeleportTo(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), GameObject::Use(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ RemoveAurasDueToItemSpell()

void Unit::RemoveAurasDueToItemSpell ( uint32  spellId,
ObjectGuid  castItemGuid 
)
5086{
5087 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
5088 {
5089 if (iter->second->GetBase()->GetCastItemGUID() == castItemGuid)
5090 {
5091 RemoveAura(iter);
5092 iter = m_appliedAuras.lower_bound(spellId);
5093 }
5094 else
5095 ++iter;
5096 }
5097
5098 for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
5099 {
5100 if (iter->second->GetCastItemGUID() == castItemGuid)
5101 {
5103 iter = m_ownedAuras.lower_bound(spellId);
5104 }
5105 else
5106 ++iter;
5107 }
5108}

References AURA_REMOVE_BY_DEFAULT, m_appliedAuras, m_ownedAuras, RemoveAura(), and RemoveOwnedAura().

Referenced by Player::ApplyEnchantment(), and Player::ApplyEquipSpell().

◆ RemoveAurasDueToSpell()

void Unit::RemoveAurasDueToSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4910{
4911 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
4912 {
4913 Aura const* aura = iter->second->GetBase();
4914 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
4915 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
4916 {
4917 RemoveAura(iter, removeMode);
4918 iter = m_appliedAuras.lower_bound(spellId);
4919 }
4920 else
4921 ++iter;
4922 }
4923}

References Aura::GetCasterGUID(), Aura::GetEffectMask(), m_appliedAuras, and RemoveAura().

Referenced by Spell::_cast(), Player::_removeTalentAurasAndSpells(), Player::ActivateSpec(), Vehicle::AddPassenger(), spell_commander_sarannis_arcane_devastation::AfterApply(), spell_dru_feral_swiftness::AfterRemove(), spell_dru_barkskin::AfterRemove(), spell_dru_savage_roar_aura::AfterRemove(), spell_dru_survival_instincts_aura::AfterRemove(), Player::ApplyEquipSpell(), boss_hakkar::boss_hakkarAI::ApplyHakkarPowerStacks(), boss_buru::ChaseNewVictim(), spell_eredar_twins_handle_touch::CheckCast(), boss_volazj::CheckPhaseMinions(), spell_botanica_shift_form_aura::CheckProc(), spell_mage_burning_determination::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), Player::CleanupAfterTaxiFlight(), AuraEffect::CleanupTriggeredSpells(), npc_kerlonian::npc_kerlonianAI::ClearSleeping(), spell_ruby_sanctum_rallying_shout::CountAllies(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_buru::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_leotheras_the_blind::DemonTime(), Player::DestroyItem(), WorldState::DispelAdalsSongOfBattle(), WorldState::DispelMagtheridonTeam(), npc_drakonid_spawner::DoAction(), npc_twilight_volunteer::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_frozen_core::DoAction(), npc_massive_jormungar::npc_massive_jormungarAI::DoAction(), npc_ferocious_rhino::npc_ferocious_rhinoAI::DoAction(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::DoAction(), npc_frenzied_worgen::npc_frenzied_worgenAI::DoAction(), boss_ambassador_hellmaw::DoAction(), boss_illidan_stormrage::DoAction(), npc_maiev_illidan::DoAction(), npc_pet_gen_argent_pony_bridle::DoAction(), boss_alar::DoDiveBomb(), InstanceScript::DoRemoveAurasDueToSpellOnPlayers(), Spell::DoTriggersOnSpellHit(), Spell::EffectApplyGlyph(), Spell::EffectHeal(), Spell::EffectRemoveAura(), Spell::EffectSchoolDMG(), npc_giant_claw_tentacle::Emerge(), boss_ahune::Emerge(), boss_zuljin::EnterPhase(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), BattleExperienceEvent::Execute(), SendEncounterUnit::Execute(), FrostBombExplosion::Execute(), AuraRemoveEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), spell_sindragosa_ice_tomb_trap_aura::ExtraRemoveEffect(), spell_mother_shahraz_fatal_attraction_dummy::FilterTargets(), spell_warr_improved_spell_reflection_trigger::FilterTargets(), lfg::LFGMgr::FinishDungeon(), spell_dru_berserk::HandleAfterCast(), spell_capacitus_polarity_charge_aura::HandleAfterRemove(), BattlegroundDS::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraControlVehicle(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), spell_moroes_vanish::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), spell_q13007_iron_colossus::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_halion_twilight_division::HandleDummy(), spell_putricide_ooze_eruption_searcher::HandleDummy(), spell_warhead_detonate::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), HandleDummyAuraProc(), spell_magtheridon_shadow_grasp_visual::HandleDummyRemove(), spell_shadowfang_keep_forsaken_skills_aura::HandleDummyTick(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_q12730_quenching_mist::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_reliquary_of_souls_aura_of_suffering_aura::HandleEffectRemove(), spell_serpentshrine_cavern_coilfang_water::HandleEffectRemove(), spell_q10769_dissension_amongst_the_ranks_aura::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), spell_midsummer_fling_torch::HandleFinish(), gm_commandscript::HandleGMVisibleCommand(), spell_oculus_drake_flag_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectRemove(), spell_transitus_shield_beam_aura::HandleOnEffectRemove(), OPvPCapturePointZM_GraveYard::HandleOpenGo(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_algalon_phase_punch_aura::HandlePeriodic(), spell_algalon_remove_phase_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), OutdoorPvPEP::HandlePlayerLeaveZone(), OutdoorPvPHP::HandlePlayerLeaveZone(), OutdoorPvPNA::HandlePlayerLeaveZone(), OutdoorPvPSI::HandlePlayerLeaveZone(), OutdoorPvPTF::HandlePlayerLeaveZone(), OutdoorPvPZM::HandlePlayerLeaveZone(), WorldState::HandlePlayerLeaveZone(), spell_gen_consume::HandleProc(), spell_pri_t4_4p_bonus::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), spell_icc_harvest_blight_specimen::HandleQuestComplete(), spell_felmyst_fog_of_corruption_charm_aura::HandleRemove(), spell_kiljaeden_vengeance_of_the_blue_flight_aura::HandleRemove(), spell_dru_enrage::HandleRemove(), spell_pal_divine_intervention::HandleRemove(), spell_pal_avenging_wrath::HandleRemove(), spell_rog_killing_spree_aura::HandleRemove(), spell_warr_vigilance::HandleRemove(), WorldSession::HandleRemoveGlyph(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_putricide_clear_aura_effect_value::HandleScript(), spell_the_lich_king_jump::HandleScript(), spell_the_lich_king_jump_remove_aura::HandleScript(), spell_icc_harvest_blight_specimen::HandleScript(), spell_festergut_pungent_blight::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_unbound_plague::HandleScript(), spell_putricide_eat_ooze::HandleScript(), spell_rotface_little_ooze_combine::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_rotface_large_ooze_buff_combine::HandleScript(), spell_q10651_q10692_book_of_fel_names::HandleScript(), spell_halion_clear_debuffs::HandleScriptEffect(), spell_q12823_remove_collapsing_cave_aura::HandleScriptEffect(), spell_illidari_council_judgement::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), ArenaSpectator::HandleSpectatorWatchCommand(), AuraEffect::HandleSpiritOfRedemption(), spell_capacitus_polarity_charge::HandleTargets(), misc_commandscript::HandleUnAuraCommand(), misc_commandscript::HandleUnFreezeCommand(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::HealReceived(), npc_underbog_mushroom::InitializeAI(), npc_demon_chain::JustDied(), boss_azuregos::boss_azuregosAI::JustDied(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::JustDied(), boss_zuljin::JustEngagedWith(), boss_bronjahm::boss_bronjahmAI::JustEngagedWith(), boss_doomwalker::JustEngagedWith(), boss_gruul::JustEngagedWith(), boss_pathaleon_the_calculator::JustEngagedWith(), npc_pet_shaman_fire_elemental::JustEngagedWith(), boss_the_lich_king::boss_the_lich_kingAI::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_buru::JustEngagedWith(), boss_gal_darah::boss_gal_darahAI::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustEngagedWith(), boss_hydross_the_unstable::JustReachedHome(), boss_felblood_kaelthas::LapseAction(), boss_garfrost::boss_garfrostAI::MovementInform(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::MovementInform(), boss_felmyst::MovementInform(), boss_shade_of_akama::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), boss_skadi_grauf::boss_skadi_graufAI::MovementInform(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), spell_halion_twilight_realm_aura::OnApply(), spell_halion_leave_twilight_realm_aura::OnApply(), spell_systems_shutdown_aura::OnApply(), npc_chesspiece::OnCharmed(), npc_eye_of_acherus::OnCharmed(), npc_aged_dying_ancient_kodo::OnGossipHello(), lfg::LFGPlayerScript::OnMapChanged(), spell_claw_rage_aura::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), spell_gen_curse_of_pain::OnPeriodic(), spell_illidan_demon_transform2_aura::OnPeriodic(), BattlefieldWG::OnPlayerLeaveZone(), boss_shade_of_aran::OnPowerUpdate(), spell_halion_combustion_consumption_aura::OnRemove(), spell_halion_leave_twilight_realm_aura::OnRemove(), spell_algalon_phase_punch_aura::OnRemove(), spell_load_into_catapult_aura::OnRemove(), spell_gen_damage_reduction_aura::OnRemove(), spell_hun_ascpect_of_the_viper::OnRemove(), spell_hun_viper_attack_speed::OnRemove(), spell_item_with_mount_speed::OnRemove(), spell_item_desperate_defense::OnRemove(), spell_item_shadowmourne::OnRemove(), spell_item_shadowmourne_soul_fragment::OnRemove(), spell_mage_combustion_proc::OnRemove(), spell_item_shadowmourne_soul_fragment::OnStackChange(), MidsummerPlayerScript::OnUpdateZone(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::PassengerBoarded(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::PassengerBoarded(), boss_jeklik::PathEndReached(), ProcessTerrainStatusUpdate(), spell_gen_defend::RefreshVisualShields(), RemoveAurasDueToSpellByDispel(), BattlefieldWG::RemoveAurasFromPlayer(), boss_festergut::boss_festergutAI::RemoveBlight(), spell_warl_health_funnel::RemoveEffect(), RemoveGameObject(), BattlegroundAV::RemovePlayer(), Battleground::RemovePlayerFromResurrectQueue(), boss_keristrasza::RemovePrison(), Pet::removeSpell(), Player::removeSpell(), spell_gen_eject_all_passengers::RemoveVehicleAuras(), spell_gen_defend::RemoveVisualShields(), boss_malchezaar::Reset(), npc_mograine::npc_mograineAI::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), npc_singularity::Reset(), boss_twilight_corrupter::Reset(), boss_nalorakk::Reset(), boss_mandokir::boss_mandokirAI::Reset(), boss_thekal::Reset(), boss_cthun::Reset(), boss_viscidus::Reset(), boss_halion::boss_halionAI::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_leotheras_the_blind::Reset(), boss_lethon::boss_lethonAI::Reset(), boss_taerar::boss_taerarAI::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), Player::ResurrectPlayer(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_magtheridon::ScheduleCombatEvents(), boss_supremus::SchedulePhase(), boss_laj::ScheduleTasks(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), OPvPCapturePointZM_GraveYard::SetBeaconState(), boss_hydross_the_unstable::SetForm(), Player::SetGMVisible(), boss_mandokir::boss_mandokirAI::SetGUID(), Player::SetIsSpectator(), SetModelVisible(), npc_akama_shade::sGossipSelect(), boss_viscidus::SoftReset(), boss_ossirian::SpellHit(), npc_omen::npc_omenAI::SpellHit(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHit(), boss_faerlina::boss_faerlinaAI::SpellHit(), advisor_baseAI::SpellHit(), boss_moorabi::boss_moorabiAI::SpellHitTarget(), boss_festergut::boss_festergutAI::SpellHitTarget(), boss_ahune::Submerge(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_cthun::SummonedCreatureDies(), npc_kiljaeden_controller::SummonedCreatureDies(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonedCreatureDies(), boss_anzu::SummonedCreatureDies(), boss_viscidus::SummonedCreatureDies(), boss_terestian_illhoof::SummonKilrek(), Player::SummonPet(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), boss_netherspite::SwitchToBanishPhase(), boss_netherspite::SwitchToPortalPhase(), Totem::UnSummon(), spell_black_temple_spell_absorption_aura::Update(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_eye_of_acherus::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_moam::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), boss_volazj::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_freya_lifebinder::boss_freya_lifebinderAI::UpdateAI(), boss_freya_healthy_spore::boss_freya_healthy_sporeAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_anzu::UpdateAI(), npc_pet_gen_soul_trader_beacon::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), npc_pet_darting_hatchling::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::UpdateAI(), and Player::UpdateTitansGrip().

◆ RemoveAurasDueToSpellByDispel()

void Unit::RemoveAurasDueToSpellByDispel ( uint32  spellId,
uint32  dispellerSpellId,
ObjectGuid  casterGUID,
Unit dispeller,
uint8  chargesRemoved = 1 
)
4943{
4944 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4945 for (AuraMap::iterator iter = range.first; iter != range.second;)
4946 {
4947 Aura* aura = iter->second;
4948 if (aura->GetCasterGUID() == casterGUID)
4949 {
4950 DispelInfo dispelInfo(dispeller, dispellerSpellId, chargesRemoved);
4951
4952 // Call OnDispel hook on AuraScript
4953 aura->CallScriptDispel(&dispelInfo);
4954
4956 aura->ModCharges(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
4957 else
4958 aura->ModStackAmount(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
4959
4960 // Call AfterDispel hook on AuraScript
4961 aura->CallScriptAfterDispel(&dispelInfo);
4962
4963 switch (aura->GetSpellInfo()->SpellFamilyName)
4964 {
4965 case SPELLFAMILY_HUNTER:
4966 {
4967 // Noxious Stings
4968 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x1000)
4969 {
4970 if (Unit* caster = aura->GetCaster())
4971 {
4972 if (AuraEffect* aureff = caster->GetAuraEffect(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_HUNTER, 3521, 1))
4973 {
4974 if (Aura* noxious = Aura::TryCreate(aura->GetSpellInfo(), aura->GetEffectMask(), dispeller, caster))
4975 {
4976 noxious->SetDuration(aura->GetDuration() * aureff->GetAmount() / 100);
4977 if (aura->GetUnitOwner())
4978 if (const std::vector<int32>* spell_triggered = sSpellMgr->GetSpellLinked(-int32(aura->GetId())))
4979 for (std::vector<int32>::const_iterator itr = spell_triggered->begin(); itr != spell_triggered->end(); ++itr)
4980 aura->GetUnitOwner()->RemoveAurasDueToSpell(*itr);
4981 }
4982 }
4983 }
4984 }
4985 break;
4986 }
4988 {
4989 // Icy Clutch, remove with Frost Fever
4990 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x4000000)
4991 {
4992 if (AuraEffect* aureff = GetAuraEffect(SPELL_AURA_MOD_DECREASE_SPEED, SPELLFAMILY_DEATHKNIGHT, 0, 0x40000, 0, casterGUID))
4993 RemoveAurasDueToSpell(aureff->GetId());
4994 }
4995 }
4996 default:
4997 break;
4998 }
4999 return;
5000 }
5001 else
5002 ++iter;
5003 }
5004}
Definition: Unit.h:296
void CallScriptDispel(DispelInfo *dispelInfo)
Definition: SpellAuras.cpp:2390
static Aura * TryCreate(SpellInfo const *spellproto, uint8 effMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemGUID=ObjectGuid::Empty)
Definition: SpellAuras.cpp:352
bool ModCharges(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: SpellAuras.cpp:973
void CallScriptAfterDispel(DispelInfo *dispelInfo)
Definition: SpellAuras.cpp:2403

References AURA_REMOVE_BY_ENEMY_SPELL, Aura::CallScriptAfterDispel(), Aura::CallScriptDispel(), GetAuraEffect(), Aura::GetCaster(), Aura::GetCasterGUID(), Aura::GetDuration(), Aura::GetEffectMask(), Aura::GetId(), DispelInfo::GetRemovedCharges(), Aura::GetSpellInfo(), Aura::GetUnitOwner(), SpellInfo::HasAttribute(), m_ownedAuras, Aura::ModCharges(), Aura::ModStackAmount(), RemoveAurasDueToSpell(), SPELL_ATTR7_DISPEL_REMOVES_CHARGES, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_HUNTER, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, sSpellMgr, and Aura::TryCreate().

Referenced by Spell::EffectDispel().

◆ RemoveAurasDueToSpellBySteal()

void Unit::RemoveAurasDueToSpellBySteal ( uint32  spellId,
ObjectGuid  casterGUID,
Unit stealer 
)
5007{
5008 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5009 for (AuraMap::iterator iter = range.first; iter != range.second;)
5010 {
5011 Aura* aura = iter->second;
5012 if (aura->GetCasterGUID() == casterGUID)
5013 {
5014 int32 damage[MAX_SPELL_EFFECTS];
5015 int32 baseDamage[MAX_SPELL_EFFECTS];
5016 uint8 effMask = 0;
5017 uint8 recalculateMask = 0;
5018 Unit* caster = aura->GetCaster();
5019 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5020 {
5021 if (aura->GetEffect(i))
5022 {
5023 baseDamage[i] = aura->GetEffect(i)->GetBaseAmount();
5024 damage[i] = aura->GetEffect(i)->GetAmount();
5025 effMask |= (1 << i);
5026 if (aura->GetEffect(i)->CanBeRecalculated())
5027 recalculateMask |= (1 << i);
5028 }
5029 else
5030 {
5031 baseDamage[i] = 0;
5032 damage[i] = 0;
5033 }
5034 }
5035
5037 // Cast duration to unsigned to prevent permanent aura's such as Righteous Fury being permanently added to caster
5038 uint32 dur = std::min(2u * MINUTE * IN_MILLISECONDS, uint32(aura->GetDuration()));
5039
5040 if (Aura* oldAura = stealer->GetAura(aura->GetId(), aura->GetCasterGUID()))
5041 {
5042 if (stealCharge)
5043 oldAura->ModCharges(1);
5044 else
5045 oldAura->ModStackAmount(1);
5046 oldAura->SetDuration(int32(dur));
5047 }
5048 else
5049 {
5050 // single target state must be removed before aura creation to preserve existing single target aura
5051 if (aura->IsSingleTarget())
5052 aura->UnregisterSingleTarget();
5053
5054 // Xinef: if stealer has same aura
5055 Aura* curAura = stealer->GetAura(aura->GetId());
5056 if (!curAura || (!curAura->IsPermanent() && curAura->GetDuration() < (int32)dur))
5057 if (Aura* newAura = Aura::TryRefreshStackOrCreate(aura->GetSpellInfo(), effMask, stealer, nullptr, &baseDamage[0], nullptr, aura->GetCasterGUID()))
5058 {
5059 // created aura must not be single target aura,, so stealer won't loose it on recast
5060 if (newAura->IsSingleTarget())
5061 {
5062 newAura->UnregisterSingleTarget();
5063 // bring back single target aura status to the old aura
5064 aura->SetIsSingleTarget(true);
5065 caster->GetSingleCastAuras().push_back(aura);
5066 }
5067 // FIXME: using aura->GetMaxDuration() maybe not blizzlike but it fixes stealing of spells like Innervate
5068 newAura->SetLoadedState(aura->GetMaxDuration(), int32(dur), stealCharge ? 1 : aura->GetCharges(), 1, recalculateMask, &damage[0]);
5069 newAura->ApplyForTargets();
5070 }
5071 }
5072
5073 if (stealCharge)
5075 else
5077
5078 return;
5079 }
5080 else
5081 ++iter;
5082 }
5083}
bool CanBeRecalculated() const
Definition: SpellAuraEffects.h:78
int32 GetBaseAmount() const
Definition: SpellAuraEffects.h:57
void UnregisterSingleTarget()
Definition: SpellAuras.cpp:1167
bool IsPermanent() const
Definition: SpellAuras.h:139

References AURA_REMOVE_BY_ENEMY_SPELL, AuraEffect::CanBeRecalculated(), AuraEffect::GetAmount(), GetAura(), AuraEffect::GetBaseAmount(), Aura::GetCaster(), Aura::GetCasterGUID(), Aura::GetCharges(), Aura::GetDuration(), Aura::GetEffect(), Aura::GetId(), Aura::GetMaxDuration(), GetSingleCastAuras(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), IN_MILLISECONDS, Aura::IsPermanent(), Aura::IsSingleTarget(), m_ownedAuras, MAX_SPELL_EFFECTS, MINUTE, Aura::ModCharges(), Aura::ModStackAmount(), Aura::SetIsSingleTarget(), SPELL_ATTR7_DISPEL_REMOVES_CHARGES, Aura::TryRefreshStackOrCreate(), and Aura::UnregisterSingleTarget().

Referenced by Spell::EffectStealBeneficialBuff().

◆ RemoveAurasWithAttribute()

void Unit::RemoveAurasWithAttribute ( uint32  flags)
5134{
5135 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5136 {
5137 SpellInfo const* spell = iter->second->GetBase()->GetSpellInfo();
5138 if (spell->Attributes & flags)
5139 RemoveAura(iter);
5140 else
5141 ++iter;
5142 }
5143}

References SpellInfo::Attributes, m_appliedAuras, and RemoveAura().

◆ RemoveAurasWithFamily()

void Unit::RemoveAurasWithFamily ( SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID 
)
5217{
5218 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5219 {
5220 Aura const* aura = iter->second->GetBase();
5221 if (!casterGUID || aura->GetCasterGUID() == casterGUID)
5222 {
5223 SpellInfo const* spell = aura->GetSpellInfo();
5224 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5225 {
5226 RemoveAura(iter);
5227 continue;
5228 }
5229 }
5230 ++iter;
5231 }
5232}

References Aura::GetCasterGUID(), Aura::GetSpellInfo(), flag96::HasFlag(), m_appliedAuras, RemoveAura(), SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by spell_warl_demonic_aegis::HandleAuraApply(), and Aura::HandleAuraSpecificMods().

◆ RemoveAurasWithInterruptFlags()

void Unit::RemoveAurasWithInterruptFlags ( uint32  flag,
uint32  except = 0,
bool  isAutoshot = false 
)
5182{
5183 if (!(m_interruptMask & flag))
5184 return;
5185
5186 // interrupt auras
5187 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end();)
5188 {
5189 Aura* aura = (*iter)->GetBase();
5190 ++iter;
5191 if ((aura->GetSpellInfo()->AuraInterruptFlags & flag) && (!except || aura->GetId() != except))
5192 {
5193 uint32 removedAuras = m_removedAurasCount;
5194 RemoveAura(aura);
5195 if (m_removedAurasCount > removedAuras + 1)
5196 iter = m_interruptableAuras.begin();
5197 }
5198 }
5199
5200 // interrupt channeled spell
5202 {
5203 if (spell->getState() == SPELL_STATE_CASTING && (spell->m_spellInfo->ChannelInterruptFlags & flag) && spell->m_spellInfo->Id != except)
5204 {
5205 // Do not interrupt if auto shot
5206 if (!(isAutoshot && spell->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS)))
5207 {
5208 InterruptNonMeleeSpells(false, spell->m_spellInfo->Id);
5209 }
5210 }
5211 }
5212
5214}

References SpellInfo::AuraInterruptFlags, CURRENT_CHANNELED_SPELL, Aura::GetId(), Aura::GetSpellInfo(), InterruptNonMeleeSpells(), m_currentSpells, m_interruptableAuras, m_interruptMask, m_removedAurasCount, RemoveAura(), SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_STATE_CASTING, and UpdateInterruptMask().

Referenced by _EnterVehicle(), AttackerStateUpdate(), ClearInPetCombat(), CombatStart(), CombatStartOnCast(), DealDamage(), Dismount(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundAB::EventPlayerClickedOnFlag(), spell_rog_killing_spree::FilterTargets(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleFeignDeath(), WorldSession::HandleGossipHelloOpcode(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModStealth(), AuraEffect::HandleModUnattackable(), WorldSession::HandleMovementOpcodes(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePhase(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), Mount(), Spell::prepare(), ProcessTerrainStatusUpdate(), Player::SetInWater(), SetStandState(), Player::TeleportTo(), and UpdatePosition().

◆ RemoveAurasWithMechanic()

void Unit::RemoveAurasWithMechanic ( uint32  mechanic_mask,
AuraRemoveMode  removemode = AURA_REMOVE_BY_DEFAULT,
uint32  except = 0 
)
5254{
5255 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5256 {
5257 Aura const* aura = iter->second->GetBase();
5258 if (!except || aura->GetId() != except)
5259 {
5260 if (aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask)
5261 {
5262 RemoveAura(iter, removemode);
5263 continue;
5264 }
5265 }
5266 ++iter;
5267 }
5268}

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetId(), Aura::GetSpellInfo(), m_appliedAuras, and RemoveAura().

Referenced by HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), spell_rog_vanish_purge::HandleRootRemove(), spell_rog_vanish_purge::HandleSnareRemove(), and RemoveMovementImpairingAuras().

◆ RemoveBindSightAuras()

void Unit::RemoveBindSightAuras ( )
11193{
11195}
@ SPELL_AURA_BIND_SIGHT
Definition: SpellAuraDefines.h:64

References RemoveAurasByType(), and SPELL_AURA_BIND_SIGHT.

Referenced by RemoveFromWorld().

◆ RemoveCharmAuras()

void Unit::RemoveCharmAuras ( )

◆ RemoveCharmedBy()

void Unit::RemoveCharmedBy ( Unit charmer)
18554{
18555 if (!IsCharmed())
18556 return;
18557
18558 if (!charmer)
18559 charmer = GetCharmer();
18560 if (charmer != GetCharmer()) // one aura overrides another?
18561 {
18562 // LOG_FATAL("entities.unit", "Unit::RemoveCharmedBy: this: {} true charmer: {} false charmer: {}",
18563 // GetGUID().ToString(), GetCharmerGUID().ToString(), charmer->GetGUID().ToString());
18564 // ABORT();
18565 return;
18566 }
18567
18568 CharmType type;
18570 type = CHARM_TYPE_POSSESS;
18571 else if (charmer && charmer->IsOnVehicle(this))
18572 type = CHARM_TYPE_VEHICLE;
18573 else
18574 type = CHARM_TYPE_CHARM;
18575
18576 if (_oldFactionId)
18577 {
18579 _oldFactionId = 0;
18580 }
18581 else
18583
18584 CastStop();
18585 AttackStop();
18586
18587 // xinef: update speed after charming
18588 UpdateSpeed(MOVE_RUN, false);
18589
18590 // xinef: do not break any controlled motion slot
18591 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == NULL_MOTION_TYPE)
18592 {
18593 StopMoving();
18595 }
18596 // xinef: if we have any controlled movement, clear active and idle only
18597 else
18599
18601
18602 // xinef: remove stunned flag if owner was mounted
18605
18606 // If charmer still exists
18607 if (!charmer)
18608 return;
18609
18610 ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer());
18611 ASSERT(type != CHARM_TYPE_VEHICLE || (IsCreature() && IsVehicle()));
18612
18613 charmer->SetCharm(this, false);
18614
18616
18617 Player* playerCharmer = charmer->ToPlayer();
18618 if (playerCharmer)
18619 {
18620 switch (type)
18621 {
18622 case CHARM_TYPE_VEHICLE:
18623 playerCharmer->SetClientControl(this, false);
18624 playerCharmer->SetClientControl(charmer, true); // verified
18627 break;
18628 case CHARM_TYPE_POSSESS:
18629 playerCharmer->SetClientControl(this, false);
18630 playerCharmer->SetClientControl(charmer, true); // verified
18635 break;
18636 case CHARM_TYPE_CHARM:
18638 {
18640 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18641 {
18643 if (GetCharmInfo())
18644 GetCharmInfo()->SetPetNumber(0, true);
18645 else
18646 LOG_ERROR("entities.unit", "Aura::HandleModCharm: target={} has a charm aura but no charm info!", GetGUID().ToString());
18647 }
18648 }
18649 break;
18650 default:
18651 break;
18652 }
18653 }
18654
18655 if (Player* player = ToPlayer())
18656 {
18657 sScriptMgr->AnticheatSetUnderACKmount(player);
18658 }
18659
18660 // xinef: restore threat
18661 for (CharmThreatMap::const_iterator itr = _charmThreatInfo.begin(); itr != _charmThreatInfo.end(); ++itr)
18662 {
18663 if (Unit* target = ObjectAccessor::GetUnit(*this, itr->first))
18664 if (!IsFriendlyTo(target))
18665 AddThreat(target, itr->second);
18666 }
18667
18668 _charmThreatInfo.clear();
18669
18670 if (Creature* creature = ToCreature())
18671 {
18672 // Vehicle should not attack its passenger after he exists the seat
18673 if (type != CHARM_TYPE_VEHICLE && charmer->IsAlive() && !charmer->IsFriendlyTo(creature))
18674 if (Attack(charmer, true))
18675 GetMotionMaster()->MoveChase(charmer);
18676
18677 // Creature will restore its old AI on next update
18678 if (creature->AI())
18679 creature->AI()->OnCharmed(false);
18680
18681 // Xinef: Remove movement flag flying
18683 }
18684 else
18685 ToPlayer()->SetClientControl(this, true); // verified
18686
18687 // a guardian should always have charminfo
18688 if (playerCharmer && this != charmer->GetFirstControlled())
18689 playerCharmer->SendRemoveControlBar();
18690
18691 // xinef: Always delete charm info (restores react state)
18692 if (IsPlayer() || (IsCreature() && !ToCreature()->IsGuardian()))
18694}
@ CREATURE_TYPE_DEMON
Definition: SharedDefines.h:2630
CharmType
Definition: CharmInfo.h:44
@ CHARM_TYPE_CHARM
Definition: CharmInfo.h:45
@ CHARM_TYPE_POSSESS
Definition: CharmInfo.h:46
@ CHARM_TYPE_VEHICLE
Definition: CharmInfo.h:47
@ CLASS_CONTEXT_PET_CHARM
Definition: UnitDefines.h:216
@ UNIT_STATE_NO_ENVIRONMENT_UPD
Definition: UnitDefines.h:177
@ MOVE_RUN
Definition: UnitDefines.h:329
@ UNIT_FLAG_DISABLE_MOVE
Definition: UnitDefines.h:231
@ MOTION_SLOT_CONTROLLED
Definition: MotionMaster.h:65
@ MOTION_SLOT_ACTIVE
Definition: MotionMaster.h:64
@ NULL_MOTION_TYPE
Definition: MotionMaster.h:58
uint32 unit_class
Definition: CreatureData.h:213
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition: Object.cpp:750
void SendRemoveControlBar()
Definition: Player.cpp:9707
void SetClientControl(Unit *target, bool allowMove, bool packetOnly=false)
Definition: Player.cpp:12865
void DeleteCharmInfo()
Definition: Unit.cpp:15820
void RestoreFaction()
Definition: Unit.cpp:18696
void SetCharm(Unit *target, bool apply)
Definition: Unit.cpp:10876
void StopAttackingInvalidTarget()
Definition: Unit.cpp:20204
void CastStop(uint32 except_spellid=0, bool withInstant=true)
Interrupt the unit cast for all the current spells.
Definition: Unit.cpp:1160
bool Attack(Unit *victim, bool meleeAttack)
Definition: Unit.cpp:10272
CharmThreatMap _charmThreatInfo
Definition: Unit.h:2060
void RemoveUnitMovementFlag(uint32 f)
Definition: Unit.h:735
void UpdateSpeed(UnitMoveType mtype, bool forced)
Definition: Unit.cpp:14250
void InitDefault()
Definition: MotionMaster.cpp:87
void MovementExpiredOnSlot(MovementSlot slot, bool reset=true)
Definition: MotionMaster.h:194
void MovementExpired(bool reset=true)
Definition: MotionMaster.h:180

References _charmThreatInfo, _oldFactionId, AddThreat(), ASSERT, Attack(), AttackStop(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, CLASS_CONTEXT_PET_CHARM, CLASS_WARLOCK, ClearUnitState(), CREATURE_TYPE_DEMON, DeleteCharmInfo(), GetCharmer(), GetCharmInfo(), Creature::GetCreatureTemplate(), GetFirstControlled(), Object::GetGUID(), GetMotionMaster(), ObjectAccessor::GetUnit(), HasUnitState(), MotionMaster::InitDefault(), IsAlive(), IsCharmed(), IsClass(), Object::IsCreature(), IsFriendlyTo(), IsGuardian(), IsOnVehicle(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, MOTION_SLOT_ACTIVE, MOTION_SLOT_CONTROLLED, MOVE_RUN, MotionMaster::MoveChase(), MotionMaster::MovementExpired(), MotionMaster::MovementExpiredOnSlot(), MOVEMENTFLAG_FLYING, NULL_MOTION_TYPE, RemoveUnitFlag(), RemoveUnitMovementFlag(), RestoreFaction(), Player::SendRemoveControlBar(), Object::SetByteValue(), SetCharm(), Player::SetClientControl(), SetFaction(), CharmInfo::SetPetNumber(), sScriptMgr, StopAttackingInvalidTarget(), StopMoving(), Object::ToCreature(), Object::ToPlayer(), Position::ToString(), CreatureTemplate::type, CreatureTemplate::unit_class, UNIT_FIELD_BYTES_0, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_POSSESSED, UNIT_FLAG_STUNNED, UNIT_STATE_NO_ENVIRONMENT_UPD, UNIT_STATE_POSSESSED, UNIT_STATE_STUNNED, and UpdateSpeed().

Referenced by AuraEffect::HandleCharmConvert(), AuraEffect::HandleModCharm(), AuraEffect::HandleModPossess(), AuraEffect::HandleModPossessPet(), npc_chesspiece::JustDied(), Puppet::RemoveFromWorld(), Vehicle::RemovePassenger(), and npc_chesspiece::sGossipSelect().

◆ RemoveComboPointHolder()

void Unit::RemoveComboPointHolder ( Unit unit)
inline
968{ m_ComboPointHolders.erase(unit); }

References m_ComboPointHolders.

Referenced by AddComboPoints(), and ClearComboPoints().

◆ RemoveDynObject()

bool Unit::RemoveDynObject ( uint32  spellId)
6142{
6143 if (m_dynObj.empty())
6144 return false;
6145
6146 bool result = false;
6147 for (DynObjectList::iterator i = m_dynObj.begin(); i != m_dynObj.end();)
6148 {
6149 DynamicObject* dynObj = *i;
6150 if (dynObj->GetSpellId() == spellId)
6151 {
6152 dynObj->Remove();
6153 i = m_dynObj.begin();
6154 result = true;
6155 }
6156 else
6157 ++i;
6158 }
6159
6160 return result;
6161}
void Remove()
Definition: DynamicObject.cpp:185

References DynamicObject::GetSpellId(), m_dynObj, and DynamicObject::Remove().

Referenced by Spell::cancel(), Spell::EffectAddFarsight(), and spell_item_shifting_naaru_silver::OnBaseRemove().

◆ RemoveEvadeAuras()

void Unit::RemoveEvadeAuras ( )
5438{
5439 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5440 {
5441 Aura const* aura = iter->second->GetBase();
5442 SpellInfo const* spellInfo = aura->GetSpellInfo();
5444 || spellInfo->HasAura(SPELL_AURA_CLONE_CASTER) || (aura->IsPassive() && GetOwnerGUID().IsPlayer()))
5445 ++iter;
5446 else
5448 }
5449
5450 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5451 {
5452 Aura* aura = iter->second;
5453 SpellInfo const* spellInfo = aura->GetSpellInfo();
5455 || spellInfo->HasAura(SPELL_AURA_CLONE_CASTER) || (aura->IsPassive() && GetOwnerGUID().IsPlayer()))
5456 ++iter;
5457 else
5459 }
5460}
@ SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT
Definition: SharedDefines.h:444
@ SPELL_ATTR0_CU_IGNORE_EVADE
Definition: SpellInfo.h:187

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, GetOwnerGUID(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), Aura::IsPassive(), Object::IsPlayer(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CLONE_CASTER, and SPELL_AURA_CONTROL_VEHICLE.

Referenced by CreatureAI::_EnterEvadeMode(), and npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode().

◆ RemoveExtraUnitMovementFlag()

void Unit::RemoveExtraUnitMovementFlag ( uint16  f)
inline

◆ removeFollower()

void Unit::removeFollower ( FollowerReference )
inline
1755{ /* nothing to do yet */ }

Referenced by FollowerReference::targetObjectDestroyLink().

◆ RemoveFromWorld()

void Unit::RemoveFromWorld ( )
overridevirtual

Reimplemented from WorldObject.

15697{
15698 // cleanup
15699 ASSERT(GetGUID());
15700
15701 if (IsInWorld())
15702 {
15704 if (IsVehicle())
15706
15710
15713
15714 ExitVehicle(); // Remove applied auras with SPELL_AURA_CONTROL_VEHICLE
15717
15719
15720 if (GetCharmerGUID())
15721 {
15722 LOG_FATAL("entities.unit", "Unit {} has charmer guid when removed from world", GetEntry());
15723 ABORT();
15724 }
15725
15726 if (Unit* owner = GetOwner())
15727 {
15728 if (owner->m_Controlled.find(this) != owner->m_Controlled.end())
15729 {
15731 owner->SetMinion((Minion*)this, false);
15732 LOG_INFO("entities.unit", "Unit {} is in controlled list of {} when removed from world", GetEntry(), owner->GetEntry());
15733 //ABORT();
15734 }
15735 }
15736
15739 }
15740}
void RemoveFromWorld() override
Definition: Object.cpp:1182
void RemoveNotOwnSingleTargetAuras()
Definition: Unit.cpp:5145
void UnsummonAllTotems(bool onDeath=false)
Definition: Unit.cpp:11205
void RemoveAllDynObjects()
Definition: Unit.cpp:6163
void RemoveAreaAurasDueToLeaveWorld()
Definition: Unit.cpp:5286
void RemoveBindSightAuras()
Definition: Unit.cpp:11192
void RemoveAllControlled(bool onDeath=false)
Definition: Unit.cpp:11086

References ABORT, ASSERT, ExitVehicle(), GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwner(), HasUnitTypeMask(), Object::IsInWorld(), IsVehicle(), LOG_FATAL, LOG_INFO, m_duringRemoveFromWorld, RemoveAllControlled(), RemoveAllDynObjects(), RemoveAllGameObjects(), RemoveAreaAurasDueToLeaveWorld(), RemoveBindSightAuras(), RemoveCharmAuras(), WorldObject::RemoveFromWorld(), RemoveNotOwnSingleTargetAuras(), RemoveVehicleKit(), UNIT_MASK_GUARDIAN, UNIT_MASK_MINION, and UnsummonAllTotems().

Referenced by CleanupBeforeRemoveFromMap(), Creature::RemoveFromWorld(), Pet::RemoveFromWorld(), and Player::RemoveFromWorld().

◆ RemoveGameObject() [1/2]

void Unit::RemoveGameObject ( GameObject gameObj,
bool  del 
)
6198{
6199 if (!gameObj || gameObj->GetOwnerGUID() != GetGUID())
6200 return;
6201
6203
6204 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
6205 {
6206 if (m_ObjectSlot[i] == gameObj->GetGUID())
6207 {
6208 m_ObjectSlot[i].Clear();
6209 break;
6210 }
6211 }
6212
6213 // GO created by some spell
6214 if (uint32 spellid = gameObj->GetSpellId())
6215 {
6216 RemoveAurasDueToSpell(spellid);
6217
6218 if (IsPlayer())
6219 {
6220 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(spellid);
6221 // Need activate spell use for owner
6222 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6223 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6224 ToPlayer()->SendCooldownEvent(createBySpell);
6225 }
6226 }
6227
6228 m_gameObj.remove(gameObj->GetGUID());
6229
6230 if (del)
6231 {
6232 gameObj->SetRespawnTime(0);
6233 gameObj->Delete();
6234 }
6235}
void Clear()
Definition: ObjectGuid.h:138
void SendCooldownEvent(SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
Definition: Player.cpp:11115

References ObjectGuid::Clear(), GameObject::Delete(), ObjectGuid::Empty, Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), SpellInfo::IsCooldownStartedOnEvent(), Object::IsPlayer(), m_gameObj, m_ObjectSlot, MAX_GAMEOBJECT_SLOT, RemoveAurasDueToSpell(), Player::SendCooldownEvent(), GameObject::SetOwnerGUID(), GameObject::SetRespawnTime(), sSpellMgr, and Object::ToPlayer().

Referenced by Spell::cancel(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), Spell::EffectSummonObject(), gobject_commandscript::HandleGameObjectDeleteCommand(), spell_warl_demonic_circle_summon::HandleRemove(), boss_kologarn::boss_kologarnAI::JustDied(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::JustDied(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), GameObject::Update(), and npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI().

◆ RemoveGameObject() [2/2]

void Unit::RemoveGameObject ( uint32  spellid,
bool  del 
)
6238{
6239 if (m_gameObj.empty())
6240 return;
6241
6242 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
6243 {
6244 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6245 {
6246 if (spellid > 0 && go->GetSpellId() != spellid)
6247 {
6248 ++itr;
6249 continue;
6250 }
6251
6252 go->SetOwnerGUID(ObjectGuid::Empty);
6253 if (del)
6254 {
6255 go->SetRespawnTime(0);
6256 go->Delete();
6257 }
6258 }
6259 m_gameObj.erase(itr++);
6260 }
6261}

References ObjectGuid::Empty, ObjectAccessor::GetGameObject(), and m_gameObj.

◆ removeHatedBy()

void Unit::removeHatedBy ( HostileReference )
inline
906{ /* nothing to do yet */ }

Referenced by HostileReference::targetObjectDestroyLink().

◆ RemoveMovementImpairingAuras()

void Unit::RemoveMovementImpairingAuras ( bool  withRoot)
5235{
5236 if (withRoot)
5238
5239 // Snares
5240 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5241 {
5242 Aura const* aura = iter->second->GetBase();
5244 {
5245 RemoveAura(iter);
5246 continue;
5247 }
5248
5249 ++iter;
5250 }
5251}
bool HasEffectMechanic(Mechanics mechanic) const
Definition: SpellInfo.cpp:884

References Aura::GetSpellInfo(), SpellInfo::HasEffectMechanic(), m_appliedAuras, SpellInfo::Mechanic, MECHANIC_ROOT, MECHANIC_SNARE, RemoveAura(), and RemoveAurasWithMechanic().

Referenced by Spell::CheckCast(), Spell::EffectTriggerSpell(), HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), and spell_gen_remove_impairing_auras::HandleScriptEffect().

◆ RemoveNotOwnSingleTargetAuras()

void Unit::RemoveNotOwnSingleTargetAuras ( )
5146{
5147 // single target auras from other casters
5148 // Iterate m_ownedAuras - aura is marked as single target in Unit::AddAura (and pushed to m_ownedAuras).
5149 // m_appliedAuras will NOT contain the aura before first Unit::Update after adding it to m_ownedAuras.
5150 // Quickly removing such an aura will lead to it not being unregistered from caster's single cast auras container
5151 // leading to assertion failures if the aura was cast on a player that can
5152 // (and is changing map at the point where this function is called).
5153 // Such situation occurs when player is logging in inside an instance and fails the entry check for any reason.
5154 // The aura that was loaded from db (indirectly, via linked casts) gets removed before it has a chance
5155 // to register in m_appliedAuras
5156 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5157 {
5158 Aura const* aura = iter->second;
5159
5160 if (aura->GetCasterGUID() != GetGUID() && aura->IsSingleTarget())
5161 RemoveOwnedAura(iter);
5162 else
5163 ++iter;
5164 }
5165
5166 // single target auras at other targets
5167 AuraList& scAuras = GetSingleCastAuras();
5168 for (AuraList::iterator iter = scAuras.begin(); iter != scAuras.end();)
5169 {
5170 Aura* aura = *iter;
5171 if (aura->GetUnitOwner() != this)
5172 {
5173 aura->Remove();
5174 iter = scAuras.begin();
5175 }
5176 else
5177 ++iter;
5178 }
5179}

References Aura::GetCasterGUID(), Object::GetGUID(), GetSingleCastAuras(), Aura::GetUnitOwner(), Aura::IsSingleTarget(), m_ownedAuras, Aura::Remove(), and RemoveOwnedAura().

Referenced by RemoveFromWorld().

◆ RemoveNpcFlag()

void Unit::RemoveNpcFlag ( NPCFlags  flags)
inline
727{ RemoveFlag(UNIT_NPC_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_NPC_FLAGS.

Referenced by Vehicle::AddPassenger(), boss_vaelastrasz::boss_vaelAI::BeginSpeech(), npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_fos_leader::npc_fos_leaderAI::DoAction(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_akama_illidan::DoAction(), spell_q12096_q12092_dummy::HandleDummy(), npc_hyjal_jaina::hyjalJainaAI::IsSummonedBy(), npc_precious::npc_preciousAI::JustEngagedWith(), npc_artorius::npc_artoriusAI::JustEngagedWith(), npc_simone::npc_simoneAI::JustEngagedWith(), npc_nelson::npc_nelsonAI::JustEngagedWith(), npc_franklin::npc_franklinAI::JustEngagedWith(), npc_akama_illidan::JustReachedHome(), npc_fos_leader_second::npc_fos_leader_secondAI::npc_fos_leader_secondAI(), npc_pos_leader_second::npc_pos_leader_secondAI::npc_pos_leader_secondAI(), npc_chesspiece::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_announcer_toc10::OnGossipHello(), npc_hyjal_jaina::OnGossipSelect(), npc_hyjal_thrall::OnGossipSelect(), boss_doomrel::OnGossipSelect(), boss_majordomo::OnGossipSelect(), npc_zulaman_hostage::OnGossipSelect(), npc_arthas::OnGossipSelect(), npc_ulduar_keeper::OnGossipSelect(), npc_announcer_toc5::OnGossipSelect(), npc_announcer_toc10::OnGossipSelect(), npc_hor_leader::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_thrall_old_hillsbrad::OnGossipSelect(), npc_hor_leader_second::OnGossipSelect(), npc_battle_at_valhalas::OnQuestAccept(), npc_riggle_bassbait::OnQuestReward(), NPCStaveQuestAI::PrepareForEncounter(), RemoveVehicleKit(), boss_majordomo::boss_majordomoAI::Reset(), npc_arthas::npc_arthasAI::Reset(), npc_plucky::npc_pluckyAI::Reset(), npc_xerestrasza::npc_xerestraszaAI::Reset(), npc_tirion_fordring_tft::npc_tirion_fordringAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_lake_frog::npc_lake_frogAI::Reset(), npc_akama_illidan::Reset(), npc_akama_shade::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_magister_aledis::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::sGossipSelect(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::sGossipSelect(), boss_apothecary_hummel::boss_apothecary_hummelAI::sGossipSelect(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_harrison_jones::sGossipSelect(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_general_andorov::sGossipSelect(), npc_akama_shade::sGossipSelect(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_chesspiece::SpellHitTarget(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_magister_aledis::StartFight(), npc_cork_gizelton::npc_cork_gizeltonAI::SummonHelpers(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), and Vehicle::Vehicle().

◆ RemoveOwnedAura() [1/3]

void Unit::RemoveOwnedAura ( Aura aura,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4739{
4740 if (aura->IsRemoved())
4741 return;
4742
4743 ASSERT(aura->GetOwner() == this);
4744
4745 uint32 spellId = aura->GetId();
4746 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4747
4748 for (AuraMap::iterator itr = range.first; itr != range.second; ++itr)
4749 {
4750 if (itr->second == aura)
4751 {
4752 RemoveOwnedAura(itr, removeMode);
4753 return;
4754 }
4755 }
4756
4757 ABORT();
4758}

References ABORT, ASSERT, Aura::GetId(), Aura::GetOwner(), Aura::IsRemoved(), m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAura() [2/3]

void Unit::RemoveOwnedAura ( AuraMap::iterator &  i,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4706{
4707 Aura* aura = i->second;
4708 ASSERT(!aura->IsRemoved());
4709
4710 // if unit currently update aura list then make safe update iterator shift to next
4713
4714 m_ownedAuras.erase(i);
4715 m_removedAuras.push_back(aura);
4716
4717 // Unregister single target aura
4718 if (aura->IsSingleTarget())
4719 aura->UnregisterSingleTarget();
4720
4721 aura->_Remove(removeMode);
4722
4723 i = m_ownedAuras.begin();
4724}
void _Remove(AuraRemoveMode removeMode)
Definition: SpellAuras.cpp:574

References Aura::_Remove(), ASSERT, Aura::IsRemoved(), Aura::IsSingleTarget(), m_auraUpdateIterator, m_ownedAuras, m_removedAuras, and Aura::UnregisterSingleTarget().

Referenced by Player::_removeTalentAurasAndSpells(), _UpdateSpells(), Player::ActivateSpec(), Spell::EffectApplyGlyph(), WorldSession::HandleCancelAuraOpcode(), WorldSession::HandlePetCancelAuraOpcode(), WorldSession::HandleRemoveGlyph(), AuraEffect::HandleShapeshiftBoosts(), boss_zuljin::JustEngagedWith(), spell_gen_animal_blood::OnApply(), spell_contagion_of_rot::OnApply(), UnitAura::Remove(), RemoveAllAuras(), RemoveAllAurasExceptType(), RemoveAllAurasOnDeath(), RemoveAllAurasRequiringDeadTarget(), RemoveAurasDueToItemSpell(), RemoveEvadeAuras(), Player::RemoveItemDependentAurasAndCasts(), RemoveNotOwnSingleTargetAuras(), RemoveOwnedAura(), RemoveOwnedAuras(), Player::removeSpell(), boss_falric::boss_falricAI::UpdateAI(), and Player::UpdateAreaDependentAuras().

◆ RemoveOwnedAura() [3/3]

void Unit::RemoveOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4727{
4728 for (AuraMap::iterator itr = m_ownedAuras.lower_bound(spellId); itr != m_ownedAuras.upper_bound(spellId);)
4729 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask) && (!casterGUID || itr->second->GetCasterGUID() == casterGUID))
4730 {
4731 RemoveOwnedAura(itr, removeMode);
4732 itr = m_ownedAuras.lower_bound(spellId);
4733 }
4734 else
4735 ++itr;
4736}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAuras() [1/2]

void Unit::RemoveOwnedAuras ( std::function< bool(Aura const *)> const &  check)
4858{
4859 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
4860 {
4861 if (check(iter->second))
4862 {
4863 RemoveOwnedAura(iter);
4864 continue;
4865 }
4866 ++iter;
4867 }
4868}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAuras() [2/2]

void Unit::RemoveOwnedAuras ( uint32  spellId,
std::function< bool(Aura const *)> const &  check 
)
4884{
4885 for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
4886 {
4887 if (check(iter->second))
4888 {
4889 RemoveOwnedAura(iter);
4890 continue;
4891 }
4892 ++iter;
4893 }
4894}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemovePetAura()

void Unit::RemovePetAura ( PetAura const *  petSpell)
17311{
17312 if (!IsPlayer())
17313 return;
17314
17315 m_petAuras.erase(petSpell);
17316 if (Pet* pet = ToPlayer()->GetPet())
17317 pet->RemoveAurasDueToSpell(petSpell->GetAura(pet->GetEntry()));
17318 if (Unit* charm = GetCharm())
17319 charm->RemoveAurasDueToSpell(petSpell->GetAura(charm->GetEntry()));
17320}

References PetAura::GetAura(), GetCharm(), Object::IsPlayer(), m_petAuras, and Object::ToPlayer().

Referenced by Player::_removeTalentAurasAndSpells(), Pet::CastPetAuras(), AuraEffect::HandleAuraDummy(), and Player::removeSpell().

◆ RemovePlayerFromVision()

void Unit::RemovePlayerFromVision ( Player player)
11182{
11183 m_sharedVision.remove(player);
11184 player->m_isInSharedVisionOf.erase(this);
11185 if (m_sharedVision.empty())
11186 {
11187 setActive(false);
11188 SetWorldObject(false);
11189 }
11190}

References Player::m_isInSharedVisionOf, m_sharedVision, WorldObject::setActive(), and WorldObject::SetWorldObject().

Referenced by Player::SetViewpoint(), and Player::~Player().

◆ RemovePointedBy()

void Unit::RemovePointedBy ( SafeUnitPointer sup)
inline

◆ RemoveStandFlags()

void Unit::RemoveStandFlags ( uint8  flags)
inline
@ UNIT_BYTES_1_OFFSET_VIS_FLAG
Definition: UnitDefines.h:25
void RemoveByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition: Object.cpp:930

References Object::RemoveByteFlag(), UNIT_BYTES_1_OFFSET_VIS_FLAG, and UNIT_FIELD_BYTES_1.

Referenced by AuraEffect::HandleModStealth(), Player::InitStatsForLevel(), and npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI().

◆ RemoveUnitFlag()

void Unit::RemoveUnitFlag ( UnitFlags  flags)
inline

UnitFlags available in UnitDefines.h.

714{ RemoveFlag(UNIT_FIELD_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_FIELD_FLAGS.

Referenced by spell_the_lich_king_trigger_vile_spirit::ActivateSpirit(), Player::BuildPlayerRepop(), boss_thekal::CheckPhaseTransition(), Player::CleanupAfterTaxiFlight(), ClearInCombat(), ClearInPetCombat(), boss_alar::DamageTaken(), DisableRotate(), boss_thorim::boss_thorimAI::DisableThorim(), Dismount(), boss_dorothee::DoAction(), boss_roar::DoAction(), boss_strawman::DoAction(), boss_tinhead::DoAction(), boss_thekal::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), boss_the_lurker_below::DoAction(), npc_frozen_core::DoAction(), boss_broggok::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_cthun::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), npc_massive_jormungar::npc_massive_jormungarAI::DoAction(), npc_ferocious_rhino::npc_ferocious_rhinoAI::DoAction(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::DoAction(), npc_frenzied_worgen::npc_frenzied_worgenAI::DoAction(), boss_illidan_stormrage::DoAction(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DoAction(), boss_essence_of_desire::boss_essence_of_desireAI::DoAction(), boss_essence_of_anger::boss_essence_of_angerAI::DoAction(), boss_kelidan_the_breaker::DoAction(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), HomeMovementGenerator< Creature >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), WorldSession::DoLootRelease(), Spell::EffectResurrectPet(), Spell::EffectSkinning(), npc_giant_claw_tentacle::Emerge(), boss_ahune::Emerge(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_bronjahm::boss_bronjahmAI::EnterEvadeMode(), npc_ghostly_priest::npc_ghostly_priestAI::EnterEvadeMode(), npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::EnterEvadeMode(), npc_spectral_footman::npc_spectral_footmanAI::EnterEvadeMode(), npc_tortured_rifleman::npc_tortured_riflemanAI::EnterEvadeMode(), boss_kelthuzad::boss_kelthuzadAI::EnterEvadeMode(), boss_malygos::boss_malygosAI::EnterEvadeMode(), boss_ymiron::boss_ymironAI::EnterEvadeMode(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::EnterEvadeMode(), npc_future_you::npc_future_youAI::EnterEvadeMode(), SACActivateEvent::Execute(), boss_ingvar_the_plunderer::FeignDeath(), TimedFleeingMovementGenerator::Finalize(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::HandleDummy(), spell_gen_model_visible::HandleEffectRemove(), spell_gen_feign_death_all_flags::HandleEffectRemove(), spell_gen_feign_death_no_dyn_flag::HandleEffectRemove(), spell_gen_feign_death_no_prevent_emotes::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLogoutCancelOpcode(), spell_oculus_drake_flag_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectRemove(), WorldSession::HandlePlayerLoginToCharInWorld(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_kiljaeden::InitializeAI(), boss_jarien::IsSummonedBy(), boss_sothos::IsSummonedBy(), boss_apothecary_hummel::boss_apothecary_hummelAI::JustDied(), boss_volazj::JustDied(), boss_ichoron::boss_ichoronAI::JustDied(), boss_taerar::boss_taerarAI::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_ymiron::boss_ymironAI::JustEngagedWith(), boss_hazzarah::JustSummoned(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), boss_shade_of_akama::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_amanitar_mushrooms::npc_amanitar_mushrooms(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_dire_maul::instance_dire_maul_InstanceMapScript::OnCreatureCreate(), npc_death_knight_initiate::OnGossipSelect(), npc_bessy::OnQuestAccept(), spell_halion_twilight_phasing_aura::OnRemove(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), RemoveCharmedBy(), Vehicle::RemovePassenger(), boss_keristrasza::RemovePrison(), boss_lord_valthalak::boss_lord_valthalakAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_crone::Reset(), boss_julianne::Reset(), npc_mograine::npc_mograineAI::Reset(), boss_felmyst::Reset(), boss_kalecgos::Reset(), boss_muru::Reset(), npc_harrison_jones::Reset(), npc_amanishi_lookout::Reset(), boss_eye_of_cthun::Reset(), boss_volazj::Reset(), boss_anub_arak::boss_anub_arakAI::Reset(), boss_general_zarithrian::boss_general_zarithrianAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), boss_novos::boss_novosAI::Reset(), boss_bronjahm::boss_bronjahmAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_professor_putricide::boss_professor_putricideAI::Reset(), boss_gothik::boss_gothikAI::Reset(), boss_kelthuzad::boss_kelthuzadAI::Reset(), boss_malygos::boss_malygosAI::Reset(), npc_crystalline_frayer::Reset(), boss_eregos::boss_eregosAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_sjonnir::boss_sjonnirAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_mimiron::boss_mimironAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_ingvar_the_plunderer::Reset(), boss_svala::boss_svalaAI::Reset(), boss_ymiron::boss_ymironAI::Reset(), boss_ichoron::boss_ichoronAI::Reset(), npc_wounded_skirmisher::Reset(), npc_venture_co_straggler::npc_venture_co_stragglerAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), boss_leotheras_the_blind::Reset(), npc_shattered_hand_scout::Reset(), boss_kaelthas::Reset(), advisor_baseAI::Reset(), emerald_dragonAI::Reset(), npc_doctor::npc_doctorAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Resurrect(), boss_magtheridon::ScheduleCombatEvents(), boss_the_lurker_below::SchedulerPhaseTwo(), SetCharm(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::SetData(), npc_ulduar_vx001::npc_ulduar_vx001AI::SetData(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::SetData(), Pet::setDeathState(), SetImmuneToNPC(), SetImmuneToPC(), Player::SetIsSpectator(), SetStunned(), SetSwim(), Battlefield::ShowNpc(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::SpellHit(), npc_ulduar_vx001::npc_ulduar_vx001AI::SpellHit(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::SpellHit(), npc_infernal_attacker::npc_infernal_attackerAI::SpellHit(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), advisor_baseAI::SpellHit(), npc_nether_drake::npc_nether_drakeAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_headless_horseman_head::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), boss_lord_valthalak::boss_lord_valthalakAI::StartFighting(), boss_noth::boss_nothAI::StartGroundPhase(), boss_felmyst::StartIntro(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_volazj::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_crystalline_frayer::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::WaypointReached(), and npc_general_andorov::WaypointReached().

◆ RemoveUnitFlag2()

◆ RemoveUnitMovementFlag()

◆ RemoveVehicleKit()

void Unit::RemoveVehicleKit ( )
18729{
18730 if (!m_vehicleKit)
18731 return;
18732
18734 delete m_vehicleKit;
18735
18736 m_vehicleKit = nullptr;
18737
18738 m_updateFlag &= ~UPDATEFLAG_VEHICLE;
18739 m_unitTypeMask &= ~UNIT_MASK_VEHICLE;
18741}
@ UNIT_NPC_FLAG_SPELLCLICK
Definition: UnitDefines.h:318
@ UNIT_NPC_FLAG_PLAYER_VEHICLE
Definition: UnitDefines.h:319
void RemoveNpcFlag(NPCFlags flags)
Definition: Unit.h:727

References m_unitTypeMask, Object::m_updateFlag, m_vehicleKit, RemoveNpcFlag(), Vehicle::Uninstall(), UNIT_NPC_FLAG_PLAYER_VEHICLE, and UNIT_NPC_FLAG_SPELLCLICK.

Referenced by Dismount(), AuraEffect::HandleAuraSetVehicle(), npc_gunship::npc_gunshipAI::JustDied(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), spell_blood_queen_frenzied_bloodthirst_aura::OnRemove(), and RemoveFromWorld().

◆ RemoveVisibleAura()

void Unit::RemoveVisibleAura ( uint8  slot)
inline
1421{ m_visibleAuras.erase(slot); UpdateAuraForGroup(slot);}
void UpdateAuraForGroup(uint8 slot)
Definition: Unit.cpp:17170

References m_visibleAuras, and UpdateAuraForGroup().

Referenced by AuraApplication::_Remove().

◆ ReplaceAllDynamicFlags()

◆ ReplaceAllNpcFlags()

void Unit::ReplaceAllNpcFlags ( NPCFlags  flags)
inline

References SetUInt32Value(), and UNIT_NPC_FLAGS.

Referenced by Pet::CreateBaseAtTamed(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), Spell::EffectSummonType(), SmartAI::EndPath(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFlagCommand(), npc_lord_arete::npc_lord_areteAI::InitializeAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), npc_akama_illidan::JustSummoned(), Pet::LoadPetFromDB(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_shandy_dalaran::OnGossipSelect(), go_crystalline_tear::OnQuestAccept(), boss_yoggsaron_descend_portal::boss_yoggsaron_descend_portalAI::OnSpellClick(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), boss_doomrel::boss_doomrelAI::Reset(), npc_eris_hevenfire::npc_eris_hevenfireAI::Reset(), npc_taretha::npc_tarethaAI::Reset(), brann_bronzebeard::brann_bronzebeardAI::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Creature::setDeathState(), npc_eris_hevenfire::npc_eris_hevenfireAI::SetGUID(), npc_captain_saeed::npc_captain_saeedAI::SetGUID(), npc_akama_illidan::sGossipSelect(), npc_escortAI::Start(), FollowerAI::StartFollow(), SmartAI::StartPath(), Player::SummonPet(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), Creature::UpdateEntry(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), and npc_captain_saeed::npc_captain_saeedAI::WaypointReached().

◆ ReplaceAllUnitFlags()

◆ ReplaceAllUnitFlags2()

void Unit::ReplaceAllUnitFlags2 ( UnitFlags2  flags)
inline

◆ resetAttackTimer()

◆ ResetRedirectThreat()

◆ RestoreDisplayId()

void Unit::RestoreDisplayId ( )
16777{
16778 AuraEffect* handledAura = nullptr;
16779 AuraEffect* handledAuraForced = nullptr;
16780 // try to receive model from transform auras
16782 if (!transforms.empty())
16783 {
16784 // iterate over already applied transform auras - from newest to oldest
16785 for (auto i = transforms.rbegin(); i != transforms.rend(); ++i)
16786 {
16787 if (AuraApplication const* aurApp = (*i)->GetBase()->GetApplicationOfTarget(GetGUID()))
16788 {
16789 if (!handledAura)
16790 handledAura = (*i);
16791 // xinef: prefer negative/forced auras
16792 if ((*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) || !aurApp->IsPositive())
16793 {
16794 handledAuraForced = (*i);
16795 break;
16796 }
16797 }
16798 }
16799 }
16800
16801 // Xinef: include clone auras (eg mirror images)
16802 if (!handledAuraForced && !handledAura)
16803 {
16805 if (!cloneAuras.empty())
16806 for (Unit::AuraEffectList::const_iterator i = cloneAuras.begin(); i != cloneAuras.end(); ++i)
16807 handledAura = *i;
16808 }
16809
16811
16812 // xinef: order of execution is important!
16813 // first forced transform auras, then shapeshifts, then normal transform
16814 // transform aura was found
16815 if (handledAuraForced)
16816 {
16817 handledAuraForced->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
16818 return;
16819 }
16820 else if (!shapeshiftAura.empty()) // we've found shapeshift
16821 {
16822 // only one such aura possible at a time
16823 if (uint32 modelId = GetModelForForm(GetShapeshiftForm(), shapeshiftAura.front()->GetId()))
16824 {
16825 SetDisplayId(modelId);
16826 return;
16827 }
16828 }
16829 else if (handledAura)
16830 {
16831 handledAura->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
16832 return;
16833 }
16834
16835 // no auras found - set modelid to default
16837}
@ AURA_EFFECT_HANDLE_SEND_FOR_CLIENT
Definition: SpellAuraDefines.h:43
uint32 GetModelForForm(ShapeshiftForm form, uint32 spellId) const
Definition: Unit.cpp:19201
void HandleEffect(AuraApplication *aurApp, uint8 mode, bool apply)
Definition: SpellAuraEffects.cpp:746

References AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, Aura::GetApplicationOfTarget(), GetAuraEffectsByType(), AuraApplication::GetBase(), Object::GetGUID(), GetModelForForm(), GetNativeDisplayId(), GetShapeshiftForm(), AuraEffect::HandleEffect(), SetDisplayId(), SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_CLONE_CASTER, SPELL_AURA_MOD_SHAPESHIFT, and SPELL_AURA_TRANSFORM.

Referenced by AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), spell_gen_aura_service_uniform::OnRemove(), and Player::SetIsSpectator().

◆ RestoreFaction()

void Unit::RestoreFaction ( )
18697{
18698 if (IsPlayer())
18700 else
18701 {
18703 {
18704 if (Unit* owner = GetOwner())
18705 {
18706 SetFaction(owner->GetFaction());
18707 return;
18708 }
18709 }
18710
18711 if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate()) // normal creature
18712 SetFaction(cinfo->faction);
18713 }
18714}
void SetFactionForRace(uint8 race)
Definition: Player.cpp:5858

References GetOwner(), getRace(), HasUnitTypeMask(), Object::IsPlayer(), SetFaction(), Player::SetFactionForRace(), Object::ToCreature(), Object::ToPlayer(), and UNIT_MASK_MINION.

Referenced by npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thekal::DoAction(), AuraEffect::HandleAuraModFaction(), npc_commandscript::HandleNpcSetOriginalFaction(), npc_enslaved_netherwing_drake::JustDied(), npc_escortAI::JustRespawned(), SmartAI::JustRespawned(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::JustSummoned(), RemoveCharmedBy(), npc_death_knight_initiate::npc_death_knight_initiateAI::Reset(), npc_crusade_persuaded::npc_crusade_persuadedAI::Reset(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), npc_ahnqiraji_critter::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_magister_aledis::Reset(), npc_captain_saeed::npc_captain_saeedAI::Reset(), npc_bessy::npc_bessyAI::Reset(), and npc_enslaved_netherwing_drake::Reset().

◆ ResumeMovement()

void Unit::ResumeMovement ( uint32  timer = 0,
uint8  slot = 0 
)
16682{
16683 if (slot >= MAX_MOTION_SLOT)
16684 return;
16685
16686 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16687 movementGenerator->Resume(timer);
16688}

References GetMotionMaster(), and MAX_MOTION_SLOT.

Referenced by boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight().

◆ RewardRage()

void Unit::RewardRage ( uint32  damage,
uint32  weaponSpeedHitFactor,
bool  attacker 
)
20138{
20139 // Rage formulae https://wowwiki-archive.fandom.com/wiki/Rage#Formulae
20140 float addRage;
20141
20142 float rageconversion = ((0.0091107836f * GetLevel() * GetLevel()) + 3.225598133f * GetLevel()) + 4.2652911f;
20143
20144 // Unknown if correct, but lineary adjust rage conversion above level 70
20145 if (GetLevel() > 70)
20146 rageconversion += 13.27f * (GetLevel() - 70);
20147
20148 if (attacker)
20149 {
20150 // see Bornak's bluepost explanation (05/29/2009)
20151 float rageFromDamageDealt = damage / rageconversion * 7.5f;
20152 addRage = (rageFromDamageDealt + weaponSpeedHitFactor) / 2.0f;
20153 addRage = std::min(addRage, rageFromDamageDealt * 2.0f);
20155 }
20156 else
20157 {
20158 addRage = damage / rageconversion * 2.5f;
20159
20160 // Berserker Rage effect
20161 if (HasAura(18499))
20162 addRage *= 3.0f;
20163 }
20164
20165 addRage *= sWorld->getRate(RATE_POWER_RAGE_INCOME);
20166
20167 ModifyPower(POWER_RAGE, uint32(addRage * 10));
20168}
@ SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT
Definition: SpellAuraDefines.h:276
@ RATE_POWER_RAGE_INCOME
Definition: IWorld.h:430

References AddPct(), GetLevel(), GetTotalAuraModifier(), HasAura(), ModifyPower(), POWER_RAGE, RATE_POWER_RAGE_INCOME, SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT, and sWorld.

Referenced by DealDamage(), and DealMeleeDamage().

◆ RollMeleeOutcomeAgainst() [1/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType 
) const
2782{
2783 // This is only wrapper
2784
2785 // Miss chance based on melee
2786 //float miss_chance = MeleeMissChanceCalc(victim, attType);
2787 float miss_chance = MeleeSpellMissChance(victim, attType, int32(GetWeaponSkillValue(attType, victim)) - int32(victim->GetMaxSkillValueForLevel(this)), 0);
2788
2789 // Critical hit chance
2790 float crit_chance = GetUnitCriticalChance(attType, victim);
2791 if (crit_chance < 0)
2792 crit_chance = 0;
2793
2794 float dodge_chance = victim->GetUnitDodgeChance();
2795 float block_chance = victim->GetUnitBlockChance();
2796 float parry_chance = victim->GetUnitParryChance();
2797
2798 // Useful if want to specify crit & miss chances for melee, else it could be removed
2799 //LOG_DEBUG("entities.unit", "MELEE OUTCOME: miss {} crit {} dodge {} parry {} block {}", miss_chance, crit_chance, dodge_chance, parry_chance, block_chance);
2800
2801 return RollMeleeOutcomeAgainst(victim, attType, int32(crit_chance * 100), int32(miss_chance * 100), int32(dodge_chance * 100), int32(parry_chance * 100), int32(block_chance * 100));
2802}
float GetUnitCriticalChance(WeaponAttackType attackType, Unit const *victim) const
Definition: Unit.cpp:3728

References GetMaxSkillValueForLevel(), GetUnitBlockChance(), GetUnitCriticalChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), MeleeSpellMissChance(), and RollMeleeOutcomeAgainst().

Referenced by CalculateMeleeDamage(), and RollMeleeOutcomeAgainst().

◆ RollMeleeOutcomeAgainst() [2/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType,
int32  crit_chance,
int32  miss_chance,
int32  dodge_chance,
int32  parry_chance,
int32  block_chance 
) const
2805{
2806 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks())
2807 {
2808 return MELEE_HIT_EVADE;
2809 }
2810
2811 int32 attackerMaxSkillValueForLevel = GetMaxSkillValueForLevel(victim);
2812 int32 victimMaxSkillValueForLevel = victim->GetMaxSkillValueForLevel(this);
2813
2814 int32 attackerWeaponSkill = GetWeaponSkillValue(attType, victim);
2815 int32 victimDefenseSkill = victim->GetDefenseSkillValue(this);
2816
2817 sScriptMgr->OnBeforeRollMeleeOutcomeAgainst(this, victim, attType, attackerMaxSkillValueForLevel, victimMaxSkillValueForLevel, attackerWeaponSkill, victimDefenseSkill, crit_chance, miss_chance, dodge_chance, parry_chance, block_chance);
2818
2819 // bonus from skills is 0.04%
2820 int32 skillBonus = 4 * (attackerWeaponSkill - victimMaxSkillValueForLevel);
2821 int32 sum = 0, tmp = 0;
2822 int32 roll = urand (0, 10000);
2823
2824 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: skill bonus of {} for attacker", skillBonus);
2825 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: rolled {}, miss {}, dodge {}, parry {}, block {}, crit {}",
2826 // roll, miss_chance, dodge_chance, parry_chance, block_chance, crit_chance);
2827
2828 tmp = miss_chance;
2829
2830 if (tmp > 0 && roll < (sum += tmp))
2831 {
2832 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: MISS");
2833 return MELEE_HIT_MISS;
2834 }
2835
2836 // Dodge chance
2837
2838 // only players can't dodge if attacker is behind
2839 if (victim->IsPlayer() && !victim->HasInArc(M_PI, this) && !victim->HasIgnoreHitDirectionAura())
2840 {
2841 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind and victim was a player.");
2842 }
2843 // Xinef: do not allow to dodge with CREATURE_FLAG_EXTRA_NO_DODGE flag
2844 else if (victim->IsPlayer() || !(victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_DODGE))
2845 {
2846 // Reduce dodge chance by attacker expertise rating
2847 if (IsPlayer())
2848 dodge_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2849 else
2850 dodge_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2851
2852 // Modify dodge chance by attacker SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
2854 dodge_chance = int32 (float (dodge_chance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
2855
2856 tmp = dodge_chance;
2857
2858 // xinef: if casting or stunned - cant dodge
2859 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2860 tmp = 0;
2861
2862 if ((tmp > 0) // check if unit _can_ dodge
2863 && ((tmp -= skillBonus) > 0)
2864 && roll < (sum += tmp))
2865 {
2866 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: DODGE <{}, {})", sum - tmp, sum);
2867 return MELEE_HIT_DODGE;
2868 }
2869 }
2870
2871 // parry & block chances
2872
2873 // check if attack comes from behind, nobody can parry or block if attacker is behind
2874 if (!victim->HasInArc(M_PI, this) && !victim->HasIgnoreHitDirectionAura())
2875 {
2876 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind.");
2877 }
2878 else
2879 {
2880 // Reduce parry chance by attacker expertise rating
2881 if (IsPlayer())
2882 parry_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2883 else
2884 parry_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2885
2886 if (victim->IsPlayer() || !(victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_PARRY))
2887 {
2888 tmp = parry_chance;
2889
2890 // xinef: cant parry while casting or while stunned
2891 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2892 tmp = 0;
2893
2894 if (tmp > 0 // check if unit _can_ parry
2895 && (tmp -= skillBonus) > 0
2896 && roll < (sum += tmp))
2897 {
2898 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: PARRY <{}, {})", sum - tmp, sum);
2899 return MELEE_HIT_PARRY;
2900 }
2901 }
2902
2903 if (victim->IsPlayer() || !(victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK))
2904 {
2905 tmp = block_chance;
2906
2907 // xinef: cant block while casting or while stunned
2908 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2909 tmp = 0;
2910
2911 if (tmp > 0 // check if unit _can_ block
2912 && (tmp -= skillBonus) > 0
2913 && roll < (sum += tmp))
2914 {
2915 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: BLOCK <{}, {})", sum - tmp, sum);
2916 return MELEE_HIT_BLOCK;
2917 }
2918 }
2919 }
2920
2921 // Max 40% chance to score a glancing blow against mobs that are higher level (can do only players and pets and not with ranged weapon)
2922 if (attType != RANGED_ATTACK &&
2923 (IsPlayer() || IsPet()) &&
2924 !victim->IsPlayer() && !victim->IsPet() &&
2925 GetLevel() < victim->getLevelForTarget(this))
2926 {
2927 // cap possible value (with bonuses > max skill)
2928 int32 skill = attackerWeaponSkill;
2929 int32 maxskill = attackerMaxSkillValueForLevel;
2930 skill = (skill > maxskill) ? maxskill : skill;
2931
2932 tmp = (10 + (victimDefenseSkill - skill)) * 100;
2933 tmp = tmp > 4000 ? 4000 : tmp;
2934 if (roll < (sum += tmp))
2935 {
2936 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: GLANCING <{}, {})", sum - 4000, sum);
2937 return MELEE_HIT_GLANCING;
2938 }
2939 }
2940
2941 // mobs can score crushing blows if they're 4 or more levels above victim
2942 if (getLevelForTarget(victim) >= victim->getLevelForTarget(this) + 4 &&
2943 // can be from by creature (if can) or from controlled player that considered as creature
2945 !(IsCreature() && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS))
2946 {
2947 // when their weapon skill is 15 or more above victim's defense skill
2948 tmp = victimDefenseSkill;
2949 int32 tmpmax = victimMaxSkillValueForLevel;
2950 // having defense above your maximum (from items, talents etc.) has no effect
2951 tmp = tmp > tmpmax ? tmpmax : tmp;
2952 // tmp = mob's level * 5 - player's current defense skill
2953 tmp = attackerMaxSkillValueForLevel - tmp;
2954 if (tmp >= 15)
2955 {
2956 // add 2% chance per lacking skill point, min. is 15%
2957 tmp = tmp * 200 - 1500;
2958 if (roll < (sum += tmp))
2959 {
2960 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRUSHING <{}, {})", sum - tmp, sum);
2961 return MELEE_HIT_CRUSHING;
2962 }
2963 }
2964 }
2965
2966 // Critical chance
2967 tmp = crit_chance;
2968
2969 if (tmp > 0 && roll < (sum += tmp))
2970 {
2971 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT <{}, {})", sum - tmp, sum);
2972 if (IsCreature() && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRIT))
2973 {
2974 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT DISABLED)");
2975 }
2976 else
2977 return MELEE_HIT_CRIT;
2978 }
2979
2980 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: NORMAL");
2981 return MELEE_HIT_NORMAL;
2982}
@ CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS
Definition: CreatureData.h:50
@ CREATURE_FLAG_EXTRA_NO_CRIT
Definition: CreatureData.h:62

References CREATURE_FLAG_EXTRA_NO_BLOCK, CREATURE_FLAG_EXTRA_NO_CRIT, CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS, CREATURE_FLAG_EXTRA_NO_DODGE, CREATURE_FLAG_EXTRA_NO_PARRY, CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), GetDefenseSkillValue(), GetLevel(), getLevelForTarget(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetWeaponSkillValue(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsNonMeleeSpellCast(), IsPet(), Object::IsPlayer(), LOG_DEBUG, MELEE_HIT_BLOCK, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_DODGE, MELEE_HIT_EVADE, MELEE_HIT_GLANCING, MELEE_HIT_MISS, MELEE_HIT_NORMAL, MELEE_HIT_PARRY, RANGED_ATTACK, SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONTROLLED, urand(), and VICTIMSTATE_DODGE.

◆ Say() [1/2]

◆ Say() [2/2]

void Unit::Say ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21199{
21200 Talk(textId, CHAT_MSG_MONSTER_SAY, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target);
21201}

References CHAT_MSG_MONSTER_SAY, CONFIG_LISTEN_RANGE_SAY, and sWorld.

◆ SelectNearbyNoTotemTarget()

Unit * Unit::SelectNearbyNoTotemTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
17021{
17022 std::list<Unit*> targets;
17023 Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck u_check(this, this, dist);
17025 Cell::VisitAllObjects(this, searcher, dist);
17026
17027 // remove current target
17028 if (GetVictim())
17029 targets.remove(GetVictim());
17030
17031 if (exclude)
17032 targets.remove(exclude);
17033
17034 // remove not LoS targets
17035 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
17036 {
17037 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
17038 {
17039 std::list<Unit*>::iterator tIter2 = tIter;
17040 ++tIter;
17041 targets.erase(tIter2);
17042 }
17043 else
17044 ++tIter;
17045 }
17046
17047 // no appropriate targets
17048 if (targets.empty())
17049 return nullptr;
17050
17051 // select random
17053}
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition: Containers.h:133
bool IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell=nullptr) const
Definition: Unit.cpp:13871
Definition: GridNotifiers.h:423

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitAllObjects().

Referenced by spell_rog_blade_flurry::CheckProc(), and spell_warr_sweeping_strikes::CheckProc().

◆ SelectNearbyTarget()

Unit * Unit::SelectNearbyTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
16986{
16987 std::list<Unit*> targets;
16988 Acore::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, this, dist);
16990 Cell::VisitAllObjects(this, searcher, dist);
16991
16992 // remove current target
16993 if (GetVictim())
16994 targets.remove(GetVictim());
16995
16996 if (exclude)
16997 targets.remove(exclude);
16998
16999 // remove not LoS targets
17000 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
17001 {
17002 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
17003 {
17004 std::list<Unit*>::iterator tIter2 = tIter;
17005 ++tIter;
17006 targets.erase(tIter2);
17007 }
17008 else
17009 ++tIter;
17010 }
17011
17012 // no appropriate targets
17013 if (targets.empty())
17014 return nullptr;
17015
17016 // select random
17018}
Definition: GridNotifiers.h:861

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitAllObjects().

Referenced by boss_yazzai::JustEngagedWith(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_curator::JustSummoned(), npc_hodirs_fury::npc_hodirs_furyAI::UpdateAI(), npc_storm_beacon_spawn::npc_storm_beacon_spawnAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_thorim_trap::boss_thorim_trapAI::UpdateAI(), npc_llod_generic::npc_llod_genericAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), Player::UpdateCharmedAI(), and boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI().

◆ SendAttackStateUpdate() [1/2]

void Unit::SendAttackStateUpdate ( CalcDamageInfo damageInfo)

Probably used for debugging purposes, as it is not known to appear on retail servers

6480{
6481 LOG_DEBUG("entities.unit", "WORLD: Sending SMSG_ATTACKERSTATEUPDATE");
6482
6483 uint32 tmpDamage[MAX_ITEM_PROTO_DAMAGES] = { };
6484 uint32 tmpAbsorb[MAX_ITEM_PROTO_DAMAGES] = { };
6485 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6486 {
6487 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6488 tmpDamage[i] = damageInfo->damages[i].damage;
6489 tmpAbsorb[i] = damageInfo->damages[i].absorb;
6490 if (damageInfo->target->IsPlayer() && damageInfo->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6491 {
6492 tmpAbsorb[i] = tmpDamage[i];
6493 tmpDamage[i] = 0;
6494 }
6495 }
6496
6497 uint32 count = 1;
6498 if (tmpDamage[1] || tmpAbsorb[1] || damageInfo->damages[1].resist)
6499 {
6500 ++count;
6501 }
6502
6503 std::size_t const maxsize = 4 + 5 + 5 + 4 + 4 + 1 + count * (4 + 4 + 4 + 4 + 4) + 1 + 4 + 4 + 4 + 4 + 4 * 12;
6504 WorldPacket data(SMSG_ATTACKERSTATEUPDATE, maxsize); // we guess size
6505 data << uint32(damageInfo->HitInfo);
6506 data << damageInfo->attacker->GetPackGUID();
6507 data << damageInfo->target->GetPackGUID();
6508 data << uint32(tmpDamage[0] + tmpDamage[1]); // Full damage
6509 int32 overkill = tmpDamage[0] + tmpDamage[1] - damageInfo->target->GetHealth();
6510 data << uint32(overkill < 0 ? 0 : overkill); // Overkill
6511 data << uint8(count); // Sub damage count
6512
6513 for (uint32 i = 0; i < count; ++i)
6514 {
6515 data << uint32(damageInfo->damages[i].damageSchoolMask); // School of sub damage
6516 data << float(tmpDamage[i]); // sub damage
6517 data << uint32(tmpDamage[i]); // Sub Damage
6518 }
6519
6521 {
6522 for (uint32 i = 0; i < count; ++i)
6523 {
6524 data << uint32(tmpAbsorb[i]); // Absorb
6525 }
6526 }
6527
6529 {
6530 for (uint32 i = 0; i < count; ++i)
6531 {
6532 data << uint32(damageInfo->damages[i].resist); // Resist
6533 }
6534 }
6535
6536 data << uint8(damageInfo->TargetState);
6537 data << uint32(0); // Unknown attackerstate
6538 data << uint32(0); // Melee spellid
6539
6540 if (damageInfo->HitInfo & HITINFO_BLOCK)
6541 data << uint32(damageInfo->blocked_amount);
6542
6543 if (damageInfo->HitInfo & HITINFO_RAGE_GAIN)
6544 data << uint32(0);
6545
6547 if (damageInfo->HitInfo & HITINFO_UNK1)
6548 {
6549 data << uint32(0);
6550 data << float(0);
6551 data << float(0);
6552 data << float(0);
6553 data << float(0);
6554 data << float(0);
6555 data << float(0);
6556 data << float(0);
6557 data << float(0);
6558 data << float(0); // Found in a loop with 1 iteration
6559 data << float(0); // ditto ^
6560 data << uint32(0);
6561 }
6562
6563 SendMessageToSet(&data, true);
6564}
@ HITINFO_RAGE_GAIN
Definition: Unit.h:120
@ HITINFO_UNK1
Definition: Unit.h:97
@ SMSG_ATTACKERSTATEUPDATE
Definition: Opcodes.h:360

References CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::blocked_amount, CHEAT_GOD, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), CalcDamageInfo::HitInfo, HITINFO_BLOCK, HITINFO_FULL_ABSORB, HITINFO_FULL_RESIST, HITINFO_PARTIAL_ABSORB, HITINFO_PARTIAL_RESIST, HITINFO_RAGE_GAIN, HITINFO_UNK1, Object::IsPlayer(), LOG_DEBUG, MAX_ITEM_PROTO_DAMAGES, CalcDamageInfo::resist, WorldObject::SendMessageToSet(), SMSG_ATTACKERSTATEUPDATE, CalcDamageInfo::target, CalcDamageInfo::TargetState, and Object::ToPlayer().

Referenced by AttackerStateUpdate(), misc_commandscript::HandleDamageCommand(), spell_dk_dancing_rune_weapon::HandleProc(), and SendAttackStateUpdate().

◆ SendAttackStateUpdate() [2/2]

void Unit::SendAttackStateUpdate ( uint32  HitInfo,
Unit target,
uint8  SwingType,
SpellSchoolMask  damageSchoolMask,
uint32  Damage,
uint32  AbsorbDamage,
uint32  Resist,
VictimState  TargetState,
uint32  BlockedAmount 
)
6567{
6568 CalcDamageInfo dmgInfo;
6569 dmgInfo.HitInfo = HitInfo;
6570 dmgInfo.attacker = this;
6571 dmgInfo.target = target;
6572
6573 dmgInfo.damages[0].damage = Damage - AbsorbDamage - Resist - BlockedAmount;
6574 dmgInfo.damages[0].damageSchoolMask = damageSchoolMask;
6575 dmgInfo.damages[0].absorb = AbsorbDamage;
6576 dmgInfo.damages[0].resist = Resist;
6577
6578 dmgInfo.damages[1].damage = 0;
6579 dmgInfo.damages[1].damageSchoolMask = 0;
6580 dmgInfo.damages[1].absorb = 0;
6581 dmgInfo.damages[1].resist = 0;
6582
6583 dmgInfo.TargetState = TargetState;
6584 dmgInfo.blocked_amount = BlockedAmount;
6585 SendAttackStateUpdate(&dmgInfo);
6586}
HitInfo
Definition: Unit.h:95

References CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::blocked_amount, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, CalcDamageInfo::HitInfo, CalcDamageInfo::resist, SendAttackStateUpdate(), CalcDamageInfo::target, and CalcDamageInfo::TargetState.

◆ SendChangeCurrentVictimOpcode()

void Unit::SendChangeCurrentVictimOpcode ( HostileReference pHostileReference)
20100{
20101 if (!GetThreatMgr().isThreatListEmpty())
20102 {
20103 uint32 count = GetThreatMgr().GetThreatList().size();
20104
20105 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_HIGHEST_THREAT_UPDATE Message");
20106 WorldPacket data(SMSG_HIGHEST_THREAT_UPDATE, 8 + 8 + count * 8);
20107 data << GetPackGUID();
20108 data << pHostileReference->getUnitGuid().WriteAsPacked();
20109 data << uint32(count);
20111 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
20112 {
20113 data << (*itr)->getUnitGuid().WriteAsPacked();
20114 data << uint32((*itr)->GetThreat() * 100);
20115 }
20116 SendMessageToSet(&data, false);
20117 }
20118}
@ SMSG_HIGHEST_THREAT_UPDATE
Definition: Opcodes.h:1184
std::list< HostileReference * > StorageType
Definition: ThreatMgr.h:147
PackedGuid WriteAsPacked() const
Definition: ObjectGuid.h:316

References Object::GetPackGUID(), ThreatMgr::GetThreatList(), GetThreatMgr(), HostileReference::getUnitGuid(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_HIGHEST_THREAT_UPDATE, and ObjectGuid::WriteAsPacked().

Referenced by ThreatMgr::setCurrentVictim().

◆ SendClearTarget()

void Unit::SendClearTarget ( )
20328{
20330 data << GetPackGUID();
20331 SendMessageToSet(&data, false);
20332}
@ SMSG_BREAK_TARGET
Definition: Opcodes.h:368

References Object::GetPackGUID(), WorldObject::SendMessageToSet(), and SMSG_BREAK_TARGET.

Referenced by Vehicle::AddPassenger(), and Spell::EffectForceDeselect().

◆ SendClearThreatListOpcode()

void Unit::SendClearThreatListOpcode ( )
20121{
20122 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_CLEAR Message");
20124 data << GetPackGUID();
20125 SendMessageToSet(&data, false);
20126}
@ SMSG_THREAT_CLEAR
Definition: Opcodes.h:1187

References Object::GetPackGUID(), LOG_DEBUG, WorldObject::SendMessageToSet(), and SMSG_THREAT_CLEAR.

Referenced by ThreatMgr::ClearAllThreat().

◆ SendComboPoints()

void Unit::SendComboPoints ( )
16883{
16884 if (m_cleanupDone)
16885 {
16886 return;
16887 }
16888
16890 if (Player* playerMe = ToPlayer())
16891 {
16892 WorldPacket data(SMSG_UPDATE_COMBO_POINTS, packGUID.size() + 1);
16893 data << packGUID;
16894 data << uint8(m_comboPoints);
16895 playerMe->SendDirectMessage(&data);
16896 }
16897
16898 ObjectGuid ownerGuid = GetCharmerOrOwnerGUID();
16899 Player* owner = nullptr;
16900 if (ownerGuid.IsPlayer())
16901 {
16902 owner = ObjectAccessor::GetPlayer(*this, ownerGuid);
16903 }
16904
16905 if (m_movedByPlayer || owner)
16906 {
16907 WorldPacket data(SMSG_PET_UPDATE_COMBO_POINTS, GetPackGUID().size() + packGUID.size() + 1);
16908 data << GetPackGUID();
16909 data << packGUID;
16910 data << uint8(m_comboPoints);
16911
16912 if (m_movedByPlayer)
16914
16915 if (owner && owner != m_movedByPlayer)
16916 owner->SendDirectMessage(&data);
16917 }
16918}
@ SMSG_PET_UPDATE_COMBO_POINTS
Definition: Opcodes.h:1200
@ SMSG_UPDATE_COMBO_POINTS
Definition: Opcodes.h:955
Definition: ObjectGuid.h:263
std::size_t size() const
Definition: ObjectGuid.h:274

References GetCharmerOrOwnerGUID(), Object::GetPackGUID(), ObjectAccessor::GetPlayer(), ObjectGuid::IsPlayer(), m_cleanupDone, m_comboPoints, m_comboTarget, m_movedByPlayer, Player::SendDirectMessage(), PackedGuid::size(), SMSG_PET_UPDATE_COMBO_POINTS, SMSG_UPDATE_COMBO_POINTS, and Object::ToPlayer().

Referenced by AddComboPoints(), and ClearComboPoints().

◆ SendEnergizeSpellLog()

void Unit::SendEnergizeSpellLog ( Unit victim,
uint32  SpellID,
uint32  Damage,
Powers  powertype 
)
11261{
11262 WorldPacket data(SMSG_SPELLENERGIZELOG, (8 + 8 + 4 + 4 + 4 + 1));
11263 data << victim->GetPackGUID();
11264 data << GetPackGUID();
11265 data << uint32(spellID);
11266 data << uint32(powerType);
11267 data << uint32(damage);
11268 SendMessageToSet(&data, true);
11269}
@ SMSG_SPELLENERGIZELOG
Definition: Opcodes.h:367

References Object::GetPackGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLENERGIZELOG.

Referenced by EnergizeBySpell(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ SendHealSpellLog()

void Unit::SendHealSpellLog ( HealInfo const &  healInfo,
bool  critical = false 
)
11228{
11229 uint32 overheal = healInfo.GetHeal() - healInfo.GetEffectiveHeal();
11230
11231 // we guess size
11232 WorldPacket data(SMSG_SPELLHEALLOG, (8 + 8 + 4 + 4 + 4 + 4 + 1 + 1));
11233 data << healInfo.GetTarget()->GetPackGUID();
11234 data << GetPackGUID();
11235 data << uint32(healInfo.GetSpellInfo()->Id);
11236 data << uint32(healInfo.GetHeal());
11237 data << uint32(overheal);
11238 data << uint32(healInfo.GetAbsorb()); // Absorb amount
11239 data << uint8(critical ? 1 : 0);
11240 data << uint8(0); // unused
11241 SendMessageToSet(&data, true);
11242}
@ SMSG_SPELLHEALLOG
Definition: Opcodes.h:366

References HealInfo::GetAbsorb(), HealInfo::GetEffectiveHeal(), HealInfo::GetHeal(), Object::GetPackGUID(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), SpellInfo::Id, WorldObject::SendMessageToSet(), and SMSG_SPELLHEALLOG.

Referenced by HealBySpell().

◆ SendMeleeAttackStart()

void Unit::SendMeleeAttackStart ( Unit victim,
Player sendTo = nullptr 
)
3062{
3063 WorldPacket data(SMSG_ATTACKSTART, 8 + 8);
3064 data << GetGUID();
3065 data << victim->GetGUID();
3066 if (sendTo)
3067 sendTo->SendDirectMessage(&data);
3068 else
3069 SendMessageToSet(&data, true);
3070 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTART");
3071}
@ SMSG_ATTACKSTART
Definition: Opcodes.h:353

References Object::GetGUID(), LOG_DEBUG, Player::SendDirectMessage(), WorldObject::SendMessageToSet(), and SMSG_ATTACKSTART.

Referenced by Attack(), Player::GetInitialVisiblePackets(), and boss_leotheras_the_blind::Reset().

◆ SendMeleeAttackStop()

void Unit::SendMeleeAttackStop ( Unit victim = nullptr)

Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead.

3078{
3079 // pussywizard: calling SendMeleeAttackStop without clearing UNIT_STATE_MELEE_ATTACKING and then AttackStart the same player may spoil npc rotating!
3080 // pussywizard: this happens in some boss scripts, just add clearing here
3081 // ClearUnitState(UNIT_STATE_MELEE_ATTACKING); // commented out for now
3082
3083 WorldPacket data(SMSG_ATTACKSTOP, (8 + 8 + 4));
3084 data << GetPackGUID();
3085
3086 if (victim)
3087 {
3088 data << victim->GetPackGUID();
3089 data << (uint32)victim->isDead();
3090 }
3091 SendMessageToSet(&data, true);
3092 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTOP");
3093
3094 if (victim)
3095 LOG_DEBUG("entities.unit", "{} {} stopped attacking {} {}", (IsPlayer() ? "Player" : "Creature"), GetGUID().ToString(), (victim->IsPlayer() ? "player" : "creature"), victim->GetGUID().ToString());
3096 else
3097 LOG_DEBUG("entities.unit", "{} {} stopped attacking", (IsPlayer() ? "Player" : "Creature"), GetGUID().ToString());
3098}
@ SMSG_ATTACKSTOP
Definition: Opcodes.h:354
bool isDead() const
Definition: Unit.h:1656

References Object::GetGUID(), Object::GetPackGUID(), isDead(), Object::IsPlayer(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_ATTACKSTOP, ObjectGuid::ToString(), and Position::ToString().

Referenced by Attack(), AttackStop(), boss_garfrost::boss_garfrostAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_svalna_revive_champion::Land(), boss_leotheras_the_blind::Reset(), SetControlled(), boss_razorscale::boss_razorscaleAI::SpellHit(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), and boss_razorscale::boss_razorscaleAI::UpdateAI().

◆ SendMonsterMove()

void Unit::SendMonsterMove ( float  NewPosX,
float  NewPosY,
float  NewPosZ,
uint32  TransitTime,
SplineFlags  sf = SPLINEFLAG_WALK_MODE 
)
538{
539 WorldPacket data(SMSG_MONSTER_MOVE, 1 + 12 + 4 + 1 + 4 + 4 + 4 + 12 + GetPackGUID().size());
540 data << GetPackGUID();
541
542 data << uint8(0); // new in 3.1
543 data << GetPositionX() << GetPositionY() << GetPositionZ();
544 data << GameTime::GetGameTimeMS().count();
545 data << uint8(0);
546 data << uint32(sf);
547 data << TransitTime; // Time in between points
548 data << uint32(1); // 1 single waypoint
549 data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B
550
551 SendMessageToSet(&data, true);
552}
@ SMSG_MONSTER_MOVE
Definition: Opcodes.h:251

References GameTime::GetGameTimeMS(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::SendMessageToSet(), and SMSG_MONSTER_MOVE.

Referenced by npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI().

◆ SendMovementFeatherFall()

void Unit::SendMovementFeatherFall ( Player sendTo)
20666{
20667 if (!movespline->Initialized())
20668 return;
20670 data << GetPackGUID();
20671 sendTo->SendDirectMessage(&data);
20672}
@ SMSG_SPLINE_MOVE_FEATHER_FALL
Definition: Opcodes.h:803

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_FEATHER_FALL.

Referenced by Player::GetAurasForTarget().

◆ SendMovementFlagUpdate()

void Unit::SendMovementFlagUpdate ( bool  self = false)
16706{
16707 WorldPacket data;
16708 BuildHeartBeatMsg(&data);
16709 SendMessageToSet(&data, self);
16710}
void BuildHeartBeatMsg(WorldPacket *data) const
Definition: Object.cpp:2073

References BuildHeartBeatMsg(), and WorldObject::SendMessageToSet().

Referenced by boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_nightbane::EnterEvadeMode(), boss_kaelthas::ExecuteMiddleEvent(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_harbinger_skyriss::JustSummoned(), MotionMaster::MoveFall(), npc_twilight_volunteer::MovementInform(), boss_felmyst::MovementInform(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), npc_dancing_flames::npc_dancing_flamesAI::Reset(), boss_felmyst::ScheduleFlightSequence(), SetCharm(), SetHover(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_felmyst::StartIntro(), boss_nightbane::TriggerHealthTakeOff(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), Player::UpdateCharmedAI(), and brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI().

◆ SendMovementHover()

void Unit::SendMovementHover ( Player sendTo)
20703{
20704 if (!movespline->Initialized())
20705 return;
20707 data << GetPackGUID();
20708 sendTo->SendDirectMessage(&data);
20709}
@ SMSG_SPLINE_MOVE_SET_HOVER
Definition: Opcodes.h:805

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_SET_HOVER.

Referenced by Player::GetAurasForTarget().

◆ SendMovementWaterWalking()

void Unit::SendMovementWaterWalking ( Player sendTo)
20644{
20645 if (!movespline->Initialized())
20646 return;
20648 data << GetPackGUID();
20649 sendTo->SendDirectMessage(&data);
20650}
@ SMSG_SPLINE_MOVE_WATER_WALK
Definition: Opcodes.h:807

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_WATER_WALK.

Referenced by Player::GetAurasForTarget().

◆ SendPeriodicAuraLog()

void Unit::SendPeriodicAuraLog ( SpellPeriodicAuraLogInfo pInfo)
6390{
6391 AuraEffect const* aura = pInfo->auraEff;
6393 data << GetPackGUID();
6394 data << aura->GetCasterGUID().WriteAsPacked();
6395 data << uint32(aura->GetId()); // spellId
6396 data << uint32(1); // count
6397 data << uint32(aura->GetAuraType()); // auraId
6398 switch (aura->GetAuraType())
6399 {
6402 {
6403 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6404 uint32 damage = pInfo->damage;
6405 uint32 absorb = pInfo->absorb;
6406 if (IsPlayer() && ToPlayer()->GetCommandStatus(CHEAT_GOD))
6407 {
6408 absorb = damage;
6409 damage = 0;
6410 }
6411
6412 data << uint32(damage); // damage
6413 data << uint32(pInfo->overDamage); // overkill?
6414 data << uint32(aura->GetSpellInfo()->GetSchoolMask());
6415 data << uint32(absorb); // absorb
6416 data << uint32(pInfo->resist); // resist
6417 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6418 }
6419 break;
6422 data << uint32(pInfo->damage); // damage
6423 data << uint32(pInfo->overDamage); // overheal
6424 data << uint32(pInfo->absorb); // absorb
6425 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6426 break;
6429 data << uint32(aura->GetMiscValue()); // power type
6430 data << uint32(pInfo->damage); // damage
6431 break;
6433 data << uint32(aura->GetMiscValue()); // power type
6434 data << uint32(pInfo->damage); // amount
6435 data << float(pInfo->multiplier); // gain multiplier
6436 break;
6437 default:
6438 LOG_ERROR("entities.unit", "Unit::SendPeriodicAuraLog: unknown aura {}", uint32(aura->GetAuraType()));
6439 return;
6440 }
6441
6442 SendMessageToSet(&data, true);
6443}
@ SPELL_AURA_OBS_MOD_HEALTH
Definition: SpellAuraDefines.h:83
@ SPELL_AURA_PERIODIC_MANA_LEECH
Definition: SpellAuraDefines.h:127
@ SPELL_AURA_PERIODIC_ENERGIZE
Definition: SpellAuraDefines.h:87
@ SMSG_PERIODICAURALOG
Definition: Opcodes.h:620
float multiplier
Definition: Unit.h:521
bool critical
Definition: Unit.h:522
uint32 overDamage
Definition: Unit.h:518
uint32 resist
Definition: Unit.h:520
uint32 damage
Definition: Unit.h:517
AuraEffect const * auraEff
Definition: Unit.h:516
uint32 absorb
Definition: Unit.h:519

References SpellPeriodicAuraLogInfo::absorb, SpellPeriodicAuraLogInfo::auraEff, CHEAT_GOD, SpellPeriodicAuraLogInfo::critical, SpellPeriodicAuraLogInfo::damage, AuraEffect::GetAuraType(), AuraEffect::GetCasterGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), Object::GetPackGUID(), SpellInfo::GetSchoolMask(), AuraEffect::GetSpellInfo(), Object::IsPlayer(), LOG_ERROR, SpellPeriodicAuraLogInfo::multiplier, SpellPeriodicAuraLogInfo::overDamage, SpellPeriodicAuraLogInfo::resist, WorldObject::SendMessageToSet(), SMSG_PERIODICAURALOG, SPELL_AURA_OBS_MOD_HEALTH, SPELL_AURA_OBS_MOD_POWER, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_ENERGIZE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_MANA_LEECH, Object::ToPlayer(), and ObjectGuid::WriteAsPacked().

Referenced by AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SendPetActionFeedback()

void Unit::SendPetActionFeedback ( uint8  msg)

-------—Pet responses methods--------------—

16610{
16611 Unit* owner = GetOwner();
16612 if (!owner || !owner->IsPlayer())
16613 return;
16614
16616 data << uint8(msg);
16617 owner->ToPlayer()->GetSession()->SendPacket(&data);
16618}
@ SMSG_PET_ACTION_FEEDBACK
Definition: Opcodes.h:740

References GetOwner(), Player::GetSession(), Object::IsPlayer(), WorldSession::SendPacket(), SMSG_PET_ACTION_FEEDBACK, and Object::ToPlayer().

Referenced by WorldSession::HandlePetCancelAuraOpcode().

◆ SendPetAIReaction()

void Unit::SendPetAIReaction ( ObjectGuid  guid)
16633{
16634 Unit* owner = GetOwner();
16635 if (!owner || !owner->IsPlayer())
16636 return;
16637
16638 WorldPacket data(SMSG_AI_REACTION, 8 + 4);
16639 data << guid;
16640 data << uint32(AI_REACTION_HOSTILE);
16641 owner->ToPlayer()->GetSession()->SendPacket(&data);
16642}
@ SMSG_AI_REACTION
Definition: Opcodes.h:346

References AI_REACTION_HOSTILE, GetOwner(), Player::GetSession(), Object::IsPlayer(), WorldSession::SendPacket(), SMSG_AI_REACTION, and Object::ToPlayer().

Referenced by PetAI::DoAttack(), and WorldSession::HandlePetActionHelper().

◆ SendPetTalk()

void Unit::SendPetTalk ( uint32  pettalk)
16621{
16622 Unit* owner = GetOwner();
16623 if (!owner || !owner->IsPlayer())
16624 return;
16625
16627 data << GetGUID();
16628 data << uint32(pettalk);
16629 owner->ToPlayer()->GetSession()->SendPacket(&data);
16630}
@ SMSG_PET_ACTION_SOUND
Definition: Opcodes.h:834

References Object::GetGUID(), GetOwner(), Player::GetSession(), Object::IsPlayer(), WorldSession::SendPacket(), SMSG_PET_ACTION_SOUND, and Object::ToPlayer().

Referenced by WorldSession::HandlePetActionHelper().

◆ SendPlaySpellImpact()

void Unit::SendPlaySpellImpact ( ObjectGuid  guid,
uint32  id 
)
18921{
18923 data << guid; // target
18924 data << uint32(id); // SpellVisualKit.dbc index
18925 SendMessageToSet(&data, true);
18926}
@ SMSG_PLAY_SPELL_IMPACT
Definition: Opcodes.h:533

References WorldObject::SendMessageToSet(), and SMSG_PLAY_SPELL_IMPACT.

Referenced by debug_commandscript::HandleDebugVisualCommand(), and WorldSession::HandleTrainerBuySpellOpcode().

◆ SendPlaySpellVisual()

void Unit::SendPlaySpellVisual ( uint32  id)
18913{
18915 data << GetGUID();
18916 data << uint32(id); // SpellVisualKit.dbc index
18917 SendMessageToSet(&data, true);
18918}
@ SMSG_PLAY_SPELL_VISUAL
Definition: Opcodes.h:529

References Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_PLAY_SPELL_VISUAL.

Referenced by debug_commandscript::HandleDebugVisualCommand(), WorldSession::HandleTrainerBuySpellOpcode(), and Player::RegenerateAll().

◆ SendRemoveFromThreatListOpcode()

void Unit::SendRemoveFromThreatListOpcode ( HostileReference pHostileReference)
20129{
20130 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_REMOVE Message");
20131 WorldPacket data(SMSG_THREAT_REMOVE, 8 + 8);
20132 data << GetPackGUID();
20133 data << pHostileReference->getUnitGuid().WriteAsPacked();
20134 SendMessageToSet(&data, false);
20135}
@ SMSG_THREAT_REMOVE
Definition: Opcodes.h:1186

References Object::GetPackGUID(), HostileReference::getUnitGuid(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_THREAT_REMOVE, and ObjectGuid::WriteAsPacked().

Referenced by ThreatMgr::processThreatEvent().

◆ SendSpellDamageImmune()

void Unit::SendSpellDamageImmune ( Unit target,
uint32  spellId 
)
6470{
6471 WorldPacket data(SMSG_SPELLORDAMAGE_IMMUNE, 8 + 8 + 4 + 1);
6472 data << GetGUID();
6473 data << target->GetGUID();
6474 data << uint32(spellId);
6475 data << uint8(0); // bool - log format: 0-default, 1-debug
6476 SendMessageToSet(&data, true);
6477}
@ SMSG_SPELLORDAMAGE_IMMUNE
Definition: Opcodes.h:641

References Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLORDAMAGE_IMMUNE.

Referenced by DealMeleeDamage(), Spell::EffectEnergize(), Spell::EffectHealMaxHealth(), and AuraEffect::SendTickImmune().

◆ SendSpellDamageResist()

void Unit::SendSpellDamageResist ( Unit target,
uint32  spellId 
)
6460{
6461 WorldPacket data(SMSG_PROCRESIST, 8 + 8 + 4 + 1);
6462 data << GetGUID();
6463 data << target->GetGUID();
6464 data << uint32(spellId);
6465 data << uint8(0); // bool - log format: 0-default, 1-debug
6466 SendMessageToSet(&data, true);
6467}
@ SMSG_PROCRESIST
Definition: Opcodes.h:638

References Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_PROCRESIST.

◆ SendSpellMiss()

void Unit::SendSpellMiss ( Unit target,
uint32  spellID,
SpellMissInfo  missInfo 
)
6446{
6447 WorldPacket data(SMSG_SPELLLOGMISS, (4 + 8 + 1 + 4 + 8 + 1));
6448 data << uint32(spellID);
6449 data << GetGUID();
6450 data << uint8(0); // can be 0 or 1
6451 data << uint32(1); // target count
6452 // for (i = 0; i < target count; ++i)
6453 data << target->GetGUID(); // target GUID
6454 data << uint8(missInfo);
6455 // end loop
6456 SendMessageToSet(&data, true);
6457}
@ SMSG_SPELLLOGMISS
Definition: Opcodes.h:617

References Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLLOGMISS.

Referenced by DealMeleeDamage(), and Spell::DoAllEffectOnTarget().

◆ SendSpellNonMeleeDamageLog() [1/2]

void Unit::SendSpellNonMeleeDamageLog ( SpellNonMeleeDamage log)
6311{
6312 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6313 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6314 uint32 damage = log->damage;
6315 uint32 absorb = log->absorb;
6316 if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6317 {
6318 absorb = damage;
6319 damage = 0;
6320 }
6321 data << log->target->GetPackGUID();
6322 data << log->attacker->GetPackGUID();
6323 data << uint32(log->spellInfo->Id);
6324 data << uint32(damage); // damage amount
6325 int32 overkill = damage - log->target->GetHealth();
6326 data << uint32(overkill > 0 ? overkill : 0); // overkill
6327 data << uint8 (log->schoolMask); // damage school
6328 data << uint32(absorb); // AbsorbedDamage
6329 data << uint32(log->resist); // resist
6330 data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
6331 data << uint8 (log->unused); // unused
6332 data << uint32(log->blocked); // blocked
6333 data << uint32(log->HitInfo);
6334 data << uint32(log->HitInfo);
6336 //if (log->HitInfo & SPELL_HIT_TYPE_CRIT_DEBUG)
6337 //{
6338 // data << float(log->CritRoll);
6339 // data << float(log->CritNeeded);
6340 //}
6341 //if (log->HitInfo & SPELL_HIT_TYPE_HIT_DEBUG)
6342 //{
6343 // data << float(log->HitRoll);
6344 // data << float(log->HitNeeded);
6345 //}
6346 //if (log->HitInfo & SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG)
6347 //{
6348 // data << float(log->MissChance);
6349 // data << float(log->DodgeChance);
6350 // data << float(log->ParryChance);
6351 // data << float(log->BlockChance);
6352 // data << float(log->GlanceChance);
6353 // data << float(log->CrushChance);
6354 //}
6355 SendMessageToSet(&data, true);
6356}
@ SPELL_HIT_TYPE_HIT_DEBUG
Definition: SharedDefines.h:1537
@ SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG
Definition: SharedDefines.h:1540
@ SPELL_HIT_TYPE_CRIT_DEBUG
Definition: SharedDefines.h:1535
@ SMSG_SPELLNONMELEEDAMAGELOG
Definition: Opcodes.h:622
bool physicalLog
Definition: Unit.h:503
bool unused
Definition: Unit.h:504

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, Object::IsPlayer(), SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, WorldObject::SendMessageToSet(), SMSG_SPELLNONMELEEDAMAGELOG, SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG, SPELL_HIT_TYPE_CRIT_DEBUG, SPELL_HIT_TYPE_HIT_DEBUG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), and SpellNonMeleeDamage::unused.

Referenced by CalcAbsorbResist(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectEnvironmentalDMG(), spell_sindragosa_s_fury::HandleDummy(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandleProcTriggerDamageAuraProc(), and SendSpellNonMeleeDamageLog().

◆ SendSpellNonMeleeDamageLog() [2/2]

void Unit::SendSpellNonMeleeDamageLog ( Unit target,
SpellInfo const *  spellInfo,
uint32  Damage,
SpellSchoolMask  damageSchoolMask,
uint32  AbsorbedDamage,
uint32  Resist,
bool  PhysicalDamage,
uint32  Blocked,
bool  CriticalHit = false,
bool  Split = false 
)
6359{
6360 SpellNonMeleeDamage log(this, target, spellInfo, damageSchoolMask);
6361 log.damage = Damage;
6362 log.absorb = AbsorbedDamage;
6363 log.resist = Resist;
6364 log.physicalLog = PhysicalDamage;
6365 log.blocked = Blocked;
6366 log.HitInfo = 0;
6367 if (CriticalHit)
6368 {
6369 log.HitInfo |= SPELL_HIT_TYPE_CRIT;
6370 }
6371 if (Split)
6372 {
6373 log.HitInfo |= SPELL_HIT_TYPE_SPLIT;
6374 }
6376}
@ SPELL_HIT_TYPE_SPLIT
Definition: SharedDefines.h:1538
Definition: Unit.h:489

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, SpellNonMeleeDamage::damage, SpellNonMeleeDamage::HitInfo, SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SendSpellNonMeleeDamageLog(), SPELL_HIT_TYPE_CRIT, and SPELL_HIT_TYPE_SPLIT.

◆ SendSpellNonMeleeReflectLog()

void Unit::SendSpellNonMeleeReflectLog ( SpellNonMeleeDamage log,
Unit attacker 
)
6279{
6280 // Xinef: function for players only, placed in unit because of cosmetics
6281 if (!IsPlayer())
6282 return;
6283
6284 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6285 // If we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our HP bar will not drop
6286 uint32 damage = log->damage;
6287 uint32 absorb = log->absorb;
6288 if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6289 {
6290 absorb = damage;
6291 damage = 0;
6292 }
6293 data << log->target->GetPackGUID();
6294 data << attacker->GetPackGUID();
6295 data << uint32(log->spellInfo->Id);
6296 data << uint32(damage); // damage amount
6297 int32 overkill = damage - log->target->GetHealth();
6298 data << uint32(overkill > 0 ? overkill : 0); // overkill
6299 data << uint8 (log->schoolMask); // damage school
6300 data << uint32(absorb); // AbsorbedDamage
6301 data << uint32(log->resist); // resist
6302 data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
6303 data << uint8 (log->unused); // unused
6304 data << uint32(log->blocked); // blocked
6305 data << uint32(log->HitInfo);
6306 data << uint8 (0); // flag to use extend data
6307 ToPlayer()->SendDirectMessage(&data);
6308}

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, Object::IsPlayer(), SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, Player::SendDirectMessage(), SMSG_SPELLNONMELEEDAMAGELOG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), and SpellNonMeleeDamage::unused.

Referenced by Spell::DoAllEffectOnTarget().

◆ SendTameFailure()

void Unit::SendTameFailure ( uint8  result)
20001{
20003 data << uint8(result);
20004 ToPlayer()->SendDirectMessage(&data);
20005}
@ SMSG_PET_TAME_FAILURE
Definition: Opcodes.h:401

References Player::SendDirectMessage(), SMSG_PET_TAME_FAILURE, and Object::ToPlayer().

Referenced by spell_hun_tame_beast::CheckCast(), and Spell::CheckCast().

◆ SendTeleportPacket()

void Unit::SendTeleportPacket ( Position pos)
20008{
20010 if (IsCreature())
20011 Relocate(&pos);
20012 if (IsPlayer())
20013 {
20014 ToPlayer()->SetCanTeleport(true);
20015 }
20016 WorldPacket data2(MSG_MOVE_TELEPORT, 38);
20017 data2 << GetPackGUID();
20018 BuildMovementPacket(&data2);
20019 if (IsCreature())
20020 Relocate(&oldPos);
20021 if (IsPlayer())
20022 Relocate(&pos);
20023 SendMessageToSet(&data2, false);
20024}
@ MSG_MOVE_TELEPORT
Definition: Opcodes.h:227

References BuildMovementPacket(), Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::IsCreature(), Object::IsPlayer(), MSG_MOVE_TELEPORT, Position::Relocate(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), and Object::ToPlayer().

Referenced by NearTeleportTo(), and Player::TeleportTo().

◆ SendThreatListUpdate()

void Unit::SendThreatListUpdate ( )
20080{
20081 if (!GetThreatMgr().isThreatListEmpty())
20082 {
20083 uint32 count = GetThreatMgr().GetThreatList().size();
20084
20085 //LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_UPDATE Message");
20086 WorldPacket data(SMSG_THREAT_UPDATE, 8 + count * 8);
20087 data << GetPackGUID();
20088 data << uint32(count);
20090 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
20091 {
20092 data << (*itr)->getUnitGuid().WriteAsPacked();
20093 data << uint32((*itr)->GetThreat() * 100);
20094 }
20095 SendMessageToSet(&data, false);
20096 }
20097}
@ SMSG_THREAT_UPDATE
Definition: Opcodes.h:1185

References Object::GetPackGUID(), ThreatMgr::GetThreatList(), GetThreatMgr(), WorldObject::SendMessageToSet(), and SMSG_THREAT_UPDATE.

Referenced by Update().

◆ SetAI()

void Unit::SetAI ( UnitAI newAI)
inline
659{ i_AI = newAI; }

References i_AI.

◆ SetArmor()

void Unit::SetArmor ( int32  val)
inline

◆ SetAttackTime()

◆ setAttackTimer()

◆ SetAuraStack()

void Unit::SetAuraStack ( uint32  spellId,
Unit target,
uint32  stack 
)
18904{
18905 Aura* aura = target->GetAura(spellId, GetGUID());
18906 if (!aura)
18907 aura = AddAura(spellId, target);
18908 if (aura && stack)
18909 aura->SetStackAmount(stack);
18910}
void SetStackAmount(uint8 num)
Definition: SpellAuras.cpp:995

References AddAura(), GetAura(), Object::GetGUID(), and Aura::SetStackAmount().

Referenced by boss_viscidus::DamageTaken(), spell_capacitus_polarity_charge::HandleTargets(), spell_thaddius_pos_neg_charge::HandleTargets(), and BattlefieldWG::OnPlayerJoinWar().

◆ SetBaseWeaponDamage()

void Unit::SetBaseWeaponDamage ( WeaponAttackType  attType,
WeaponDamageRange  damageRange,
float  value,
uint8  damageIndex = 0 
)
inline
1137{ m_weaponDamage[attType][damageRange][damageIndex] = value; }

References m_weaponDamage.

Referenced by Player::_ApplyWeaponDamage(), Guardian::InitStatsForLevel(), and Creature::SelectLevel().

◆ SetCanDualWield()

virtual void Unit::SetCanDualWield ( bool  value)
inlinevirtual

◆ SetCanFly()

bool Unit::SetCanFly ( bool  enable,
bool  packetOnly = false 
)
virtual

Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().

Doesn't inform the client.

Reimplemented in Player, and Creature.

20609{
20611 return false;
20612
20613 if (enable)
20614 {
20617 }
20618 else
20619 {
20621 }
20622
20623 return true;
20624}
@ MOVEMENTFLAG_CAN_FLY
Definition: UnitDefines.h:368
@ MOVEMENTFLAG_MASK_MOVING_FLY
Definition: UnitDefines.h:385
void AddUnitMovementFlag(uint32 f)
Definition: Unit.h:734

References AddUnitMovementFlag(), HasUnitMovementFlag(), MOVEMENTFLAG_CAN_FLY, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_MASK_MOVING_FLY, and RemoveUnitMovementFlag().

Referenced by AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), debug_commandscript::HandleDebugMoveflagsCommand(), spell_chapter5_light_of_dawn_aura::OnApply(), spell_chapter5_light_of_dawn_aura::OnRemove(), Player::SetCanFly(), and Creature::SetCanFly().

◆ SetCanModifyStats()

◆ SetCantProc()

void Unit::SetCantProc ( bool  apply)
17288{
17289 if (apply)
17290 ++m_procDeep;
17291 else
17292 {
17294 --m_procDeep;
17295 }
17296}

References ASSERT, and m_procDeep.

Referenced by HandleDummyAuraProc(), and ProcDamageAndSpellFor().

◆ SetCharm()

void Unit::SetCharm ( Unit target,
bool  apply 
)
Todo:
: maybe we can use this flag to check if controlled by player
10877{
10878 if (apply)
10879 {
10880 if (IsPlayer())
10881 {
10882 if (!AddGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
10883 LOG_FATAL("entities.unit", "Player {} is trying to charm unit {}, but it already has a charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
10884
10885 charm->m_ControlledByPlayer = true;
10887 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10888 }
10889 else
10890 charm->m_ControlledByPlayer = false;
10891
10892 // PvP, FFAPvP
10893 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, GetByteValue(UNIT_FIELD_BYTES_2, 1));
10894
10895 if (!charm->AddGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
10896 LOG_FATAL("entities.unit", "Unit {} is being charmed, but it already has a charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
10897
10898 _isWalkingBeforeCharm = charm->IsWalking();
10900 {
10901 charm->SetWalk(false);
10902 charm->SendMovementFlagUpdate();
10903 }
10904
10905 m_Controlled.insert(charm);
10906 }
10907 else
10908 {
10909 if (IsPlayer())
10910 {
10911 if (!RemoveGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
10912 LOG_FATAL("entities.unit", "Player {} is trying to uncharm unit {}, but it has another charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
10913 }
10914
10915 if (!charm->RemoveGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
10916 LOG_FATAL("entities.unit", "Unit {} is being uncharmed, but it has another charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
10917
10918 if (charm->IsPlayer())
10919 {
10920 charm->m_ControlledByPlayer = true;
10921 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10922 charm->ToPlayer()->UpdatePvPState();
10923 }
10924 else if (Player* player = charm->GetCharmerOrOwnerPlayerOrPlayerItself())
10925 {
10926 charm->m_ControlledByPlayer = true;
10927 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10928 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, player->GetByteValue(UNIT_FIELD_BYTES_2, 1));
10929
10930 // Xinef: skip controlled erase if charmed unit is owned by charmer
10931 if (charm->IsInWorld() && !charm->IsDuringRemoveFromWorld() && player->GetGUID() == this->GetGUID() && (charm->IsPet() || charm->HasUnitTypeMask(UNIT_MASK_MINION)))
10932 return;
10933 }
10934 else
10935 {
10936 charm->m_ControlledByPlayer = false;
10937 charm->RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10938 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, 0);
10939 }
10940
10941 if (charm->IsWalking() != _isWalkingBeforeCharm)
10942 {
10943 charm->SetWalk(_isWalkingBeforeCharm);
10944 charm->SendMovementFlagUpdate(true); // send packet to self, to update movement state on player.
10945 }
10946
10947 m_Controlled.erase(charm);
10948 }
10949}
bool AddGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:686
bool RemoveGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:704

References _isWalkingBeforeCharm, Object::AddGuidValue(), Object::GetByteValue(), GetCharmerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetCharmGUID(), Object::GetEntry(), Object::GetGUID(), WorldObject::GetName(), HasUnitTypeMask(), IsDuringRemoveFromWorld(), Object::IsInWorld(), IsPet(), Object::IsPlayer(), IsWalking(), LOG_FATAL, m_Controlled, m_ControlledByPlayer, Object::RemoveGuidValue(), RemoveUnitFlag(), SendMovementFlagUpdate(), Object::SetByteValue(), SetUnitFlag(), SetWalk(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), UNIT_FIELD_BYTES_2, UNIT_FIELD_CHARM, UNIT_FIELD_CHARMEDBY, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_MASK_MINION, and Player::UpdatePvPState().

Referenced by RemoveCharmedBy(), SetCharmedBy(), and Player::StopCastingCharm().

◆ SetCharmedBy()

bool Unit::SetCharmedBy ( Unit charmer,
CharmType  type,
AuraApplication const *  aurApp = nullptr 
)
18352{
18353 if (!charmer)
18354 return false;
18355
18356 if (!charmer->IsInWorld() || charmer->IsDuringRemoveFromWorld())
18357 {
18358 return false;
18359 }
18360
18361 // dismount players when charmed
18362 if (IsPlayer())
18364
18365 if (charmer->IsPlayer())
18367
18368 ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer());
18369 if (type == CHARM_TYPE_VEHICLE && !IsVehicle()) // pussywizard
18370 throw 1;
18371 ASSERT((type == CHARM_TYPE_VEHICLE) == IsVehicle());
18372
18373 LOG_DEBUG("entities.unit", "SetCharmedBy: charmer {} ({}), charmed {} ({}), type {}.",
18374 charmer->GetEntry(), charmer->GetGUID().ToString(), GetEntry(), GetGUID().ToString(), uint32(type));
18375
18376 if (this == charmer)
18377 {
18378 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Unit {} ({}) is trying to charm itself!", GetEntry(), GetGUID().ToString());
18379 return false;
18380 }
18381
18382 //if (HasUnitState(UNIT_STATE_UNATTACKABLE))
18383 // return false;
18384
18385 if (IsPlayer() && ToPlayer()->GetTransport())
18386 {
18387 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Player on transport is trying to charm {} ({})", GetEntry(), GetGUID().ToString());
18388 return false;
18389 }
18390
18391 // Already charmed
18392 if (GetCharmerGUID())
18393 {
18394 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) has already been charmed but {} ({}) is trying to charm it!",
18395 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18396 return false;
18397 }
18398
18399 CastStop();
18400 AttackStop();
18401
18402 // Xinef: dont reset threat and combat, put them on offline list, moved down after faction changes
18403 // CombatStop(); /// @todo: CombatStop(true) may cause crash (interrupt spells)
18404 // DeleteThreatList();
18405
18406 Player* playerCharmer = charmer->ToPlayer();
18407
18408 // Charmer stop charming
18409 if (playerCharmer)
18410 {
18411 playerCharmer->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18412 playerCharmer->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18413 }
18414
18415 // Charmed stop charming
18416 if (IsPlayer())
18417 {
18418 ToPlayer()->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18419 ToPlayer()->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18420 }
18421
18422 // StopCastingCharm may remove a possessed pet?
18423 if (!IsInWorld())
18424 {
18425 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) is not in world but {} ({}) is trying to charm it!",
18426 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18427 return false;
18428 }
18429
18430 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18431 // prevent undefined behaviour
18432 if (aurApp && aurApp->GetRemoveMode())
18433 return false;
18434
18436 SetFaction(charmer->GetFaction());
18437
18438 // Set charmed
18439 charmer->SetCharm(this, true);
18440
18442
18443 if (IsCreature())
18444 {
18445 GetMotionMaster()->Clear(false);
18447 StopMoving();
18448
18449 if (charmer->IsPlayer() && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM) && ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_DEMON)
18450 {
18451 // Disable CreatureAI/SmartAI and switch to CharmAI when charmed by warlock
18452 Creature* charmed = ToCreature();
18453 charmed->NeedChangeAI = true;
18454 charmed->IsAIEnabled = false;
18455 }
18456 else
18457 {
18458 ToCreature()->AI()->OnCharmed(true);
18459 }
18460
18461 // Xinef: If creature can fly, add normal player flying flag (fixes speed)
18462 if (charmer->IsPlayer() && ToCreature()->CanFly())
18464 }
18465 else
18466 {
18467 Player* player = ToPlayer();
18468 if (player->isAFK())
18469 player->ToggleAFK();
18470
18471 player->SetClientControl(this, false); // verified
18472 }
18473
18474 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18475 // prevent undefined behaviour
18476 if (aurApp && aurApp->GetRemoveMode())
18477 return false;
18478
18479 // Pets already have a properly initialized CharmInfo, don't overwrite it.
18480 // Xinef: I need charmInfo for vehicle
18481 if (/*type != CHARM_TYPE_VEHICLE &&*/ !GetCharmInfo())
18482 {
18483 InitCharmInfo();
18484 if (type == CHARM_TYPE_POSSESS)
18486 else if (type != CHARM_TYPE_VEHICLE)
18487 {
18489
18490 // Xinef: convert charm npcs dont have pet bar so initialize them as defensive helpers
18491 if (type == CHARM_TYPE_CONVERT && IsCreature())
18493 }
18494 }
18495
18496 if (playerCharmer)
18497 {
18498 switch (type)
18499 {
18500 case CHARM_TYPE_VEHICLE:
18503 playerCharmer->SetClientControl(this, true); // verified
18504 playerCharmer->VehicleSpellInitialize();
18505 break;
18506 case CHARM_TYPE_POSSESS:
18511 playerCharmer->SetClientControl(this, true); // verified
18512 playerCharmer->PossessSpellInitialize();
18513 break;
18514 case CHARM_TYPE_CHARM:
18516 {
18518 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18519 {
18520 // to prevent client crash
18522
18523 // just to enable stat window
18524 if (GetCharmInfo())
18525 GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
18526
18527 // if charmed two demons the same session, the 2nd gets the 1st one's name
18528 SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(GameTime::GetGameTime().count())); // cast can't be helped
18529 }
18530 }
18531 if (playerCharmer->m_seer != this)
18532 {
18534 playerCharmer->CharmSpellInitialize();
18535 }
18536 break;
18537 default:
18538 break;
18539 }
18540 }
18541 else if (IsPlayer())
18543
18544 if (Creature* creature = ToCreature())
18545 creature->RefreshSwimmingFlag();
18546
18547 if (IsPlayer())
18548 sScriptMgr->OnPlayerBeingCharmed(ToPlayer(), charmer, _oldFactionId, charmer->GetFaction());
18549
18550 return true;
18551}
@ UNIT_FIELD_PET_NAME_TIMESTAMP
Definition: UpdateFields.h:133
@ CHARM_TYPE_CONVERT
Definition: CharmInfo.h:48
@ REACT_DEFENSIVE
Definition: Unit.h:549
void OnCharmed(bool apply) override
Called when unit is charmed.
Definition: CreatureAI.cpp:33
void SetReactState(ReactStates state)
A creature can have 3 ReactStates : Agressive, Passive, Neutral.
Definition: Creature.h:94
void CharmSpellInitialize()
Definition: Player.cpp:9653
WorldObject * m_seer
Definition: Player.h:2317
void ToggleAFK()
Definition: Player.cpp:1290
void PossessSpellInitialize()
Definition: Player.cpp:9550
bool isAFK() const
Definition: Player.h:1134
void VehicleSpellInitialize()
Definition: Player.cpp:9578
void StopCastingBindSight(Aura *except=nullptr)
Definition: Player.cpp:13166
void InitPossessCreateSpells()
Definition: CharmInfo.cpp:77
void InitCharmCreateSpells()
Definition: CharmInfo.cpp:98
virtual float GetFollowAngle() const
Definition: Unit.h:1756
CharmInfo * InitCharmInfo()
Definition: Unit.cpp:15812
void MoveIdle()
Definition: MotionMaster.cpp:232

References _oldFactionId, AddUnitMovementFlag(), AddUnitState(), Creature::AI(), ASSERT, AttackStop(), CanFly(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_CONVERT, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, Player::CharmSpellInitialize(), CLASS_CONTEXT_PET_CHARM, CLASS_MAGE, CLASS_WARLOCK, MotionMaster::Clear(), CREATURE_TYPE_DEMON, AuraApplication::GetBase(), GetCharmerGUID(), GetCharmInfo(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFaction(), GetFollowAngle(), GameTime::GetGameTime(), Object::GetGUID(), GetMotionMaster(), AuraApplication::GetRemoveMode(), WorldObject::GetTransport(), CharmInfo::InitCharmCreateSpells(), InitCharmInfo(), CharmInfo::InitPossessCreateSpells(), Player::isAFK(), IsAIEnabled, IsClass(), Object::IsCreature(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Object::IsPlayer(), IsVehicle(), LOG_DEBUG, LOG_FATAL, Player::m_seer, MotionMaster::MoveFollow(), MotionMaster::MoveIdle(), MOVEMENTFLAG_FLYING, NeedChangeAI, CreatureAI::OnCharmed(), PET_FOLLOW_DIST, Player::PossessSpellInitialize(), REACT_DEFENSIVE, RemoveAurasByType(), Object::SetByteValue(), SetCharm(), Player::SetClientControl(), SetFaction(), CharmInfo::SetPetNumber(), Creature::SetReactState(), SetUInt32Value(), SetUnitFlag(), sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOUNTED, sScriptMgr, StopAttackingInvalidTarget(), Player::StopCastingBindSight(), Player::StopCastingCharm(), StopMoving(), Object::ToCreature(), Player::ToggleAFK(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), CreatureTemplate::type, UNIT_FIELD_BYTES_0, UNIT_FIELD_PET_NAME_TIMESTAMP, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_POSSESSED, UNIT_STATE_NO_ENVIRONMENT_UPD, UNIT_STATE_POSSESSED, and Player::VehicleSpellInitialize().

Referenced by Vehicle::AddPassenger(), AuraEffect::HandleCharmConvert(), AuraEffect::HandleModCharm(), AuraEffect::HandleModPossess(), AuraEffect::HandleModPossessPet(), and Puppet::InitSummon().

◆ SetCharmerGUID()

void Unit::SetCharmerGUID ( ObjectGuid  owner)
inline

◆ SetCombatTimer()

void Unit::SetCombatTimer ( uint32  timer)
inline
895{ m_CombatTimer = timer; }

References m_CombatTimer.

◆ SetConfused()

void Unit::SetConfused ( bool  apply)
protected
18320{
18321 if (apply)
18322 {
18323 SetTarget();
18325 }
18326 else
18327 {
18328 if (IsAlive())
18329 {
18330 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == CONFUSED_MOTION_TYPE)
18331 {
18333 StopMoving();
18334 }
18335
18336 if (GetVictim())
18338 }
18339 }
18340
18341 // xinef: block / allow control to real mover (eg. charmer)
18342 if (IsPlayer())
18343 {
18344 if (m_movedByPlayer)
18345 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18346 //else
18347 // ToPlayer()->SetClientControl(this, !apply);
18348 }
18349}
@ CONFUSED_MOTION_TYPE
Definition: MotionMaster.h:44
void MoveConfused()
Enable the confusion movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:292

References CONFUSED_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), GetVictim(), IsAlive(), Object::IsPlayer(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveConfused(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), StopMoving(), and Object::ToPlayer().

Referenced by SetControlled().

◆ SetContestedPvP()

void Unit::SetContestedPvP ( Player attackedPlayer = nullptr,
bool  lookForNearContestedGuards = true 
)
17250{
17252
17253 if (!player || ((attackedPlayer && (attackedPlayer == player || (player->duel && player->duel->Opponent == attackedPlayer))) || player->InBattleground()))
17254 return;
17255
17256 // check if there any guards that should care about the contested flag on player
17257 if (lookForNearContestedGuards)
17258 {
17259 std::list<Unit*> targets;
17262 Cell::VisitAllObjects(this, searcher, MAX_AGGRO_RADIUS);
17263
17264 // return if there are no contested guards found
17265 if (!targets.size())
17266 {
17267 return;
17268 }
17269 }
17270
17271 player->SetContestedPvPTimer(30000);
17273 {
17276 // call MoveInLineOfSight for nearby contested guards
17278 }
17280 {
17282 // call MoveInLineOfSight for nearby contested guards
17284 }
17285}
#define MAX_AGGRO_RADIUS
Definition: Unit.h:43
void SetPlayerFlag(PlayerFlags flags)
Definition: Player.h:1109
bool InBattleground() const
Definition: Player.h:2235
void SetContestedPvPTimer(uint32 newTime)
Definition: Player.h:1852

References WorldObject::AddToNotify(), AddUnitState(), Player::duel, GetCharmerOrOwnerPlayerOrPlayerItself(), HasUnitState(), Player::InBattleground(), MAX_AGGRO_RADIUS, NOTIFY_AI_RELOCATION, PLAYER_FLAGS_CONTESTED_PVP, Player::SetContestedPvPTimer(), Player::SetPlayerFlag(), UNIT_STATE_ATTACK_PLAYER, and Cell::VisitAllObjects().

Referenced by CombatStart(), CombatStartOnCast(), Spell::DoSpellHitOnUnit(), and WorldSession::HandlePlayerLoginFromDB().

◆ SetControlled()

void Unit::SetControlled ( bool  apply,
UnitState  state,
Unit source = nullptr,
bool  isFear = false 
)
18036{
18037 if (apply)
18038 {
18039 if (HasUnitState(state))
18040 return;
18041
18042 AddUnitState(state);
18043 switch (state)
18044 {
18045 case UNIT_STATE_STUNNED:
18046 SetStunned(true);
18047 break;
18048 case UNIT_STATE_ROOT:
18050 SetRooted(true);
18051 break;
18054 {
18057 // SendAutoRepeatCancel ?
18058 SetConfused(true);
18059 CastStop(0, false);
18060 }
18061 break;
18062 case UNIT_STATE_FLEEING:
18064 {
18067 // SendAutoRepeatCancel ?
18068 SetFeared(true, source, isFear);
18069 CastStop(0, false);
18070 }
18071 break;
18072 default:
18073 break;
18074 }
18075
18076 if (IsPlayer())
18077 {
18078 sScriptMgr->AnticheatSetRootACKUpd(ToPlayer());
18079 }
18080 }
18081 else
18082 {
18083 // xinef: moved from below, checked all SetX functions, no calls to currently modified state
18084 // xinef: added to each case because of return
18085 //ClearUnitState(state);
18086
18087 switch (state)
18088 {
18089 case UNIT_STATE_STUNNED:
18090 if (HasStunAura())
18091 return;
18092 ClearUnitState(state);
18093 SetStunned(false);
18094 break;
18095 case UNIT_STATE_ROOT:
18096 // Prevent creature_template_movement rooted flag from being removed on aura expiration.
18097 if (IsCreature())
18098 {
18099 if (ToCreature()->GetCreatureTemplate()->Movement.Rooted)
18100 {
18101 return;
18102 }
18103 }
18104
18105 if (HasRootAura() || GetVehicle())
18106 return;
18107 ClearUnitState(state);
18108 SetRooted(false);
18109 break;
18111 if (HasConfuseAura())
18112 return;
18113 ClearUnitState(state);
18114 SetConfused(false);
18115 break;
18116 case UNIT_STATE_FLEEING:
18117 if (HasFearAura())
18118 return;
18119 ClearUnitState(state);
18120 SetFeared(false);
18121 break;
18122 default:
18123 return;
18124 }
18125
18126 //ClearUnitState(state);
18127
18129 SetStunned(true);
18130 else
18131 {
18133 SetRooted(true);
18134
18136 SetConfused(true);
18138 {
18139 bool isFear = false;
18140 if (HasFearAura())
18141 {
18142 isFear = true;
18143 source = ObjectAccessor::GetUnit(*this, GetAuraEffectsByType(SPELL_AURA_MOD_FEAR).front()->GetCasterGUID());
18144 }
18145
18146 if (!source)
18147 {
18148 source = getAttackerForHelper();
18149 }
18150
18151 SetFeared(true, source, isFear);
18152 }
18153 }
18154 }
18155}
Definition: Unit.h:257
void SetFeared(bool apply, Unit *fearedBy=nullptr, bool isFear=false)
Definition: Unit.cpp:18287
bool HasStunAura() const
Definition: Unit.h:1700
void SetConfused(bool apply)
Definition: Unit.cpp:18319
void SetStunned(bool apply)
Definition: Unit.cpp:18157
Unit * getAttackerForHelper() const
Definition: Unit.cpp:740
bool HasConfuseAura() const
Definition: Unit.h:1698
void SetRooted(bool apply, bool isStun=false)
Definition: Unit.cpp:18205
bool HasRootAura() const
Definition: Unit.h:1699
bool HasFearAura() const
Definition: Unit.h:1697

References AddUnitState(), CastStop(), ClearUnitState(), getAttackerForHelper(), GetAuraEffectsByType(), ObjectAccessor::GetUnit(), GetVehicle(), HasConfuseAura(), HasFearAura(), HasRootAura(), HasStunAura(), HasUnitState(), Object::IsCreature(), Object::IsPlayer(), SendMeleeAttackStop(), SetConfused(), SetFeared(), SetRooted(), SetStunned(), SPELL_AURA_MOD_FEAR, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONFUSED, UNIT_STATE_FLEEING, UNIT_STATE_MELEE_ATTACKING, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by _ExitVehicle(), Vehicle::AddPassenger(), boss_ahune::boss_ahune(), boss_ouro::boss_ouro(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_palehoof::boss_palehoofAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), Creature::DoFleeToGetAssistance(), boss_skeram::DoTeleport(), CritterAI::EnterEvadeMode(), boss_devourer_of_souls::boss_devourer_of_soulsAI::EnterEvadeMode(), boss_falric::boss_falricAI::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::EnterEvadeMode(), boss_rotface::boss_rotfaceAI::EnterEvadeMode(), boss_noth::boss_nothAI::EnterEvadeMode(), boss_thaddius_summon::boss_thaddius_summonAI::EnterEvadeMode(), boss_urom::boss_uromAI::EnterEvadeMode(), boss_varos::boss_varosAI::EnterEvadeMode(), boss_ignis::boss_ignisAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::EnterEvadeMode(), boss_ingvar_the_plunderer::EnterEvadeMode(), boss_svala::boss_svalaAI::EnterEvadeMode(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_shirrak_the_dead_watcher::EnterEvadeMode(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), AuraEffect::HandleAuraModRoot(), AuraEffect::HandleAuraModStun(), debug_commandscript::HandleDebugMoveflagsCommand(), spell_q13007_iron_colossus::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_mc_play_dead_aura::HandleEffectApply(), spell_gen_visual_dummy_stun::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_gen_visual_dummy_stun::HandleEffectRemove(), AuraEffect::HandleModConfuse(), AuraEffect::HandleModFear(), AuraEffect::HandlePreventFleeing(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove(), boss_volazj::JustDied(), CritterAI::JustEngagedWith(), boss_skadi::boss_skadiAI::JustEngagedWith(), boss_skeram::JustSummoned(), npc_twilight_volunteer::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_illidan_stormrage::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), npc_gunship_gunner::npc_gunship_gunnerAI::MovementInform(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_iron_watcher::npc_iron_watcherAI::MovementInform(), npc_buru_egg::npc_buru_egg(), npc_icc_blood_beast::npc_icc_blood_beastAI::npc_icc_blood_beastAI(), npc_raging_spirit::npc_raging_spiritAI::npc_raging_spiritAI(), npc_vengeful_shade::npc_vengeful_shadeAI::npc_vengeful_shadeAI(), spell_systems_shutdown_aura::OnApply(), spell_systems_shutdown_aura::OnRemove(), npc_akama_illidan::PathEndReached(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_skeram::Reset(), boss_volazj::Reset(), npc_twilight_summon::npc_twilight_summonAI::Reset(), boss_devourer_of_souls::boss_devourer_of_soulsAI::Reset(), boss_falric::boss_falricAI::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_noth::boss_nothAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_thaddius_summon::boss_thaddius_summonAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_ignis::boss_ignisAI::Reset(), boss_thorim_pillar::boss_thorim_pillarAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_ingvar_the_plunderer::Reset(), boss_palehoof::boss_palehoofAI::Reset(), boss_skadi::boss_skadiAI::Reset(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::Reset(), npc_iron_watcher::npc_iron_watcherAI::Reset(), boss_shirrak_the_dead_watcher::Reset(), boss_illidan_stormrage::Reset(), npc_akama_illidan::Reset(), npc_target_dummy::npc_target_dummyAI::Reset(), boss_illidan_stormrage::ScheduleAbilities(), Player::SetClientControl(), boss_urom::boss_uromAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_ionar::boss_ionarAI::Split(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_noth::boss_nothAI::StartGroundPhase(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonedCreatureDies(), boss_skeram::UpdateAI(), boss_volazj::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), npc_icc_blood_beast::npc_icc_blood_beastAI::UpdateAI(), npc_vengeful_shade::npc_vengeful_shadeAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ SetCreateHealth()

◆ SetCreateMana()

◆ SetCreateStat()

void Unit::SetCreateStat ( Stats  stat,
float  val 
)
inline

◆ SetCreatorGUID()

◆ SetCritterGUID()

void Unit::SetCritterGUID ( ObjectGuid  guid)
inline

◆ SetCurrentCastedSpell()

void Unit::SetCurrentCastedSpell ( Spell pSpell)
3958{
3959 ASSERT(pSpell); // nullptr may be never passed here, use InterruptSpell or InterruptNonMeleeSpells
3960
3961 CurrentSpellTypes CSpellType = pSpell->GetCurrentContainer();
3962
3963 if (pSpell == m_currentSpells[CSpellType]) // avoid breaking self
3964 return;
3965
3966 bool bySelf = m_currentSpells[CSpellType] && m_currentSpells[CSpellType]->m_spellInfo->Id == pSpell->m_spellInfo->Id;
3967
3968 // break same type spell if it is not delayed
3969 InterruptSpell(CSpellType, false, true, bySelf);
3970
3971 // special breakage effects:
3972 switch (CSpellType)
3973 {
3975 {
3976 // generic spells always break channeled not delayed spells
3978 {
3979 if (!s->GetSpellInfo()->IsActionAllowedChannel())
3980 {
3982 }
3983 }
3984
3985 // autorepeat breaking
3987 {
3988 // break autorepeat if not Auto Shot
3989 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
3991 m_AutoRepeatFirstCast = true;
3992 }
3993
3994 // melee spells breaking
3996 {
3997 // break melee spells if cast time
3998 if (pSpell->GetCastTime() > 0)
3999 {
4001 }
4002 }
4003 if (pSpell->GetCastTime() > 0)
4005
4006 break;
4007 }
4009 {
4010 // channel spells always break generic non-delayed and any channeled spells
4012 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
4013
4014 // it also does break autorepeat if not Auto Shot
4016 m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
4019
4020 break;
4021 }
4023 {
4024 // only Auto Shoot does not break anything
4025 if (pSpell->m_spellInfo->Id != 75)
4026 {
4027 // generic autorepeats break generic non-delayed and channeled non-delayed spells
4029 {
4030 if (!s->GetSpellInfo()->IsActionAllowedChannel())
4031 {
4033 }
4034 }
4035
4037 }
4038 // special action: set first cast flag
4039 m_AutoRepeatFirstCast = true;
4040
4041 break;
4042 }
4043
4044 default:
4045 // other spell types don't break anything now
4046 break;
4047 }
4048
4049 // current spell (if it is still here) may be safely deleted now
4050 if (m_currentSpells[CSpellType])
4051 m_currentSpells[CSpellType]->SetReferencedFromCurrent(false);
4052
4053 // set new current spell
4054 m_currentSpells[CSpellType] = pSpell;
4055 pSpell->SetReferencedFromCurrent(true);
4056
4057 pSpell->m_selfContainer = &(m_currentSpells[pSpell->GetCurrentContainer()]);
4058}
CurrentSpellTypes GetCurrentContainer() const
Definition: Spell.cpp:7916
Spell ** m_selfContainer
Definition: Spell.h:613

References AddUnitState(), ASSERT, CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, CURRENT_MELEE_SPELL, Spell::GetCastTime(), Spell::GetCurrentContainer(), GetCurrentSpell(), SpellInfo::Id, InterruptSpell(), m_AutoRepeatFirstCast, m_currentSpells, Spell::m_selfContainer, Spell::m_spellInfo, Spell::SetReferencedFromCurrent(), and UNIT_STATE_CASTING.

Referenced by Spell::prepare().

◆ setDeathState()

void Unit::setDeathState ( DeathState  s,
bool  despawn = false 
)
virtual

Reimplemented in Creature, Minion, Pet, and Player.

14554{
14555 // death state needs to be updated before RemoveAllAurasOnDeath() calls HandleChannelDeathItem(..) so that
14556 // it can be used to check creation of death items (such as soul shards).
14557 m_deathState = s;
14558
14559 if (s != DeathState::Alive && s != DeathState::JustRespawned)
14560 {
14561 CombatStop();
14564 ClearComboPointHolders(); // any combo points pointed to unit lost at it death
14565
14566 if (IsNonMeleeSpellCast(false))
14568
14569 UnsummonAllTotems(true);
14570 RemoveAllControlled(true);
14572 }
14573
14574 if (s == DeathState::JustDied)
14575 {
14576 // remove aurastates allowing special moves
14579
14580 GetMotionMaster()->Clear(false);
14582
14583 // Xinef: Remove Hover so the corpse can fall to the ground
14584 SetHover(false);
14585
14586 if (despawn)
14587 DisableSpline();
14588 else
14589 StopMoving();
14590
14591 // without this when removing IncreaseMaxHealth aura player may stuck with 1 hp
14592 // do not why since in IncreaseMaxHealth currenthealth is checked
14593 SetHealth(0);
14594 SetPower(getPowerType(), 0);
14595
14596 // Stop emote on death
14598
14599 // players in instance don't have ZoneScript, but they have InstanceScript
14601 zoneScript->OnUnitDeath(this);
14602 }
14603 else if (s == DeathState::JustRespawned)
14604 {
14605 RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground)
14606 }
14607}
@ UNIT_FLAG_SKINNABLE
Definition: UnitDefines.h:255
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1192
ZoneScript * GetZoneScript() const
Definition: Object.h:537
void ClearAllReactives()
Definition: Unit.cpp:16928
virtual bool SetHover(bool enable, bool packetOnly=false, bool updateAnimationTier=true)
Definition: Unit.cpp:20674
void ClearDiminishings()
Definition: Unit.h:1723
Definition: ZoneScript.h:26

References MotionMaster::Clear(), ClearAllReactives(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearDiminishings(), CombatStop(), HostileRefMgr::deleteReferences(), DisableSpline(), getHostileRefMgr(), WorldObject::GetInstanceScript(), GetMotionMaster(), getPowerType(), GetThreatMgr(), WorldObject::GetZoneScript(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), m_deathState, MotionMaster::MoveIdle(), RemoveAllAurasOnDeath(), RemoveAllControlled(), Object::RemoveFlag(), SetHealth(), SetHover(), SetPower(), SetUInt32Value(), StopMoving(), UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE, UNIT_NPC_EMOTESTATE, and UnsummonAllTotems().

Referenced by _ExitVehicle(), KillMagnetEvent::Execute(), Spell::finish(), WorldSession::HandlePetActionHelper(), AuraEffect::HandleSpiritOfRedemption(), Kill(), Creature::setDeathState(), and Player::setDeathState().

◆ SetDisableGravity()

bool Unit::SetDisableGravity ( bool  disable,
bool  packetOnly = false,
bool  updateAnimationTier = true 
)
virtual

◆ SetDisplayId()

◆ SetExtraUnitMovementFlags()

void Unit::SetExtraUnitMovementFlags ( uint16  f)
inline

◆ SetFacingTo()

void Unit::SetFacingTo ( float  ori)
20529{
20530 Movement::MoveSplineInit init(this);
20531 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ(), false);
20533 init.DisableTransportPathTransformations(); // It makes no sense to target global orientation
20534 init.SetFacing(ori);
20535 init.Launch();
20536}
ObjectGuid GetTransGUID() const override
Definition: Unit.cpp:18757

References Movement::MoveSplineInit::DisableTransportPathTransformations(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetTransGUID(), HasUnitMovementFlag(), Movement::MoveSplineInit::Launch(), MOVEMENTFLAG_ONTRANSPORT, Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetFacing().

Referenced by boss_twinemperorsAI::DoAction(), npc_arthas::npc_arthasAI::DoAction(), Spell::EffectDistract(), UtherBatteredHiltEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), DistractMovementGenerator::Finalize(), Creature::FocusTarget(), spell_item_unusual_compass::HandleDummy(), spell_drakkari_colossus_face_me::HandleScriptEffect(), boss_grand_warlock_nethekurse::IntroRP(), npc_hyjal_jaina::hyjalJainaAI::IsSummonedBy(), boss_ragnaros::boss_ragnarosAI::JustDied(), boss_ingvar_the_plunderer::JustSummoned(), boss_nalorakk::MoveInLineOfSight(), boss_algalon_the_observer::boss_algalon_the_observerAI::MovementInform(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::MovementInform(), boss_zuljin::MovementInform(), npc_harrison_jones::MovementInform(), boss_onyxia::MovementInform(), npc_twilight_volunteer::MovementInform(), boss_eadric::boss_eadricAI::MovementInform(), boss_paletress::boss_paletressAI::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_enslaved_proto_drake::MovementInform(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_essence_of_suffering::boss_essence_of_sufferingAI::MovementInform(), boss_essence_of_desire::boss_essence_of_desireAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_mr_smite::boss_mr_smiteAI::MovementInform(), boss_felmyst::MovementInform(), boss_saviana_ragefire::boss_saviana_ragefireAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::MovementInform(), boss_skadi_grauf::boss_skadi_graufAI::MovementInform(), spell_lurker_below_spout::OnPeriodic(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), SmartAI::PausePath(), SmartScript::ProcessAction(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Reposition(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Reposition(), boss_illidan_stormrage::ScheduleAbilities(), boss_nightbane::ScheduleFly(), Player::SetClientControl(), boss_grand_warlock_nethekurse::SetData(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), npc_chesspiece::SpellHitTarget(), boss_heigan::boss_heiganAI::StartFightPhase(), CreatureAI::TriggerAlert(), RotateMovementGenerator::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_medivh_bm::UpdateAI(), boss_onyxia::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_general_andorov::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached(), npc_argent_soldier::npc_argent_soldierAI::WaypointReached(), npc_ranger_lilatha::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetFacingToObject()

void Unit::SetFacingToObject ( WorldObject object)
Todo:
figure out under what conditions creature will move towards object instead of facing it where it currently is.
20539{
20540 // never face when already moving
20541 if (!IsStopped())
20542 return;
20543
20545 Movement::MoveSplineInit init(this);
20546 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
20547 init.SetFacing(GetAngle(object)); // when on transport, GetAngle will still return global coordinates (and angle) that needs transforming
20548 init.Launch();
20549}
bool IsStopped() const
Definition: Unit.h:1624

References Position::GetAngle(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), IsStopped(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetFacing().

Referenced by boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), npc_ranshalla::npc_ranshallaAI::DoChannelTorchSpell(), spell_yogg_saron_target_selectors::HandleScript(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_maiev_illidan::IsSummonedBy(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::JustSummoned(), boss_illidan_stormrage::JustSummoned(), npc_drakuru_shackles::npc_drakuru_shacklesAI::LockRageclaw(), npc_mograine::npc_mograineAI::MoveInLineOfSight(), npc_fairbanks::npc_fairbanksAI::MoveInLineOfSight(), boss_zuljin::MovementInform(), npc_harrison_jones::MovementInform(), npc_akama_illidan::MovementInform(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), npc_image_of_medivh::npc_image_of_medivhAI::Reset(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), boss_nightbane::ScheduleFly(), boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), boss_the_lurker_below::SchedulerPhaseOne(), boss_shade_of_aran::SetGUID(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::SetGUID(), npc_harrison_jones::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), npc_death_knight_initiate::npc_death_knight_initiateAI::SpellHit(), npc_forest_frog::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_magister_aledis::StartFight(), boss_hydross_the_unstable::SummonMovementInform(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_eachother(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_Pathaleons_Image(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_pilgrims_bounty_chair::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_hidden_cultist::npc_hidden_cultistAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI(), npc_ranshalla::npc_ranshallaAI::WaypointReached(), npc_arthas::npc_arthasAI::WaypointReached(), npc_scarlet_miner::npc_scarlet_minerAI::WaypointReached(), and npc_kaya_flathoof::npc_kaya_flathoofAI::WaypointReached().

◆ SetFaction()

void Unit::SetFaction ( uint32  faction)
10057{
10059 if (IsCreature())
10061}
void UpdateMoveInLineOfSightState()
Definition: Creature.cpp:2588

References Object::IsCreature(), SetUInt32Value(), Object::ToCreature(), UNIT_FIELD_FACTIONTEMPLATE, and Creature::UpdateMoveInLineOfSightState().

Referenced by npc_mograine::npc_mograineAI::AshbringerEvent(), npc_hidden_cultist::npc_hidden_cultistAI::AttackPlayer(), GameObject::CastSpell(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_coren_direbrew::DoAction(), npc_direbrew_antagonist::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_kalecgos::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), Spell::EffectSummonType(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::EnterEvadeMode(), BattlegroundEY::EventTeamCapturedPoint(), AuraEffect::HandleAuraModFaction(), BattlegroundIC::HandleCapturedNodes(), spell_q12096_q12092_dummy::HandleDummy(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFactionIdCommand(), npc_commandscript::HandleNpcSetFactionTempIdCommand(), spell_mutate_explode_bug::HandleOnHit(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_item_draenic_pale_ale::HandleSummon(), npc_cork_gizelton::npc_cork_gizeltonAI::ImmuneFlagSet(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_majordomo::boss_majordomoAI::InitializeAI(), npc_general_andorov::InitializeAI(), npc_sergeant_bly::npc_sergeant_blyAI::InitializeAI(), Minion::InitStats(), TempSummon::InitStats(), InitTamedPet(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), FollowerAI::JustRespawned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_volkhan::boss_volkhanAI::JustSummoned(), boss_balinda::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), Pet::LoadPetFromDB(), npc_mograine::npc_mograineAI::MoveInLineOfSight(), npc_fairbanks::npc_fairbanksAI::MoveInLineOfSight(), boss_twilight_corrupter::MoveInLineOfSight(), npc_akama_shade::MovementInform(), BattlegroundAB::NodeOccupied(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::npc_scarlet_miner_cartAI(), spell_brewfest_reveler_transform::OnApply(), npc_chesspiece::OnCharmed(), BattlefieldWG::OnCreatureCreate(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnCreatureCreate(), instance_nexus::instance_nexus_InstanceMapScript::OnCreatureCreate(), instance_black_temple::instance_black_temple_InstanceMapScript::OnCreatureCreate(), boss_azuregos::OnGossipSelect(), npc_prospector_remtravel::OnQuestAccept(), npc_gilthares::OnQuestAccept(), npc_lakota_windsong::OnQuestAccept(), npc_paoka_swiftmountain::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), npc_maghar_captive::OnQuestAccept(), npc_maxx_a_million_escort::OnQuestAccept(), npc_kaya_flathoof::OnQuestAccept(), npc_wizzlecrank_shredder::OnQuestAccept(), npc_ame::OnQuestAccept(), npc_ranshalla::OnQuestAccept(), npc_lurgglbr::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_apothecary_hanes::OnQuestAccept(), npc_bessy::OnQuestAccept(), npc_isla_starmane::OnQuestAccept(), go_crystalline_tear::OnQuestAccept(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), BattlegroundAV::PopulateNode(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), RemoveCharmedBy(), boss_doomrel::boss_doomrelAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), npc_coren_direbrew::Reset(), npc_direbrew_minion::Reset(), npc_aquementas::npc_aquementasAI::Reset(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::Reset(), npc_plucky::npc_pluckyAI::Reset(), boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::Reset(), brann_bronzebeard::brann_bronzebeardAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), npc_captured_rageclaw::npc_captured_rageclawAI::Reset(), npc_akama_shade::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), RestoreFaction(), SetCharmedBy(), Player::SetFactionForRace(), Player::SetGameMaster(), npc_captain_saeed::npc_captain_saeedAI::SetGUID(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), BattlegroundIC::SetupBattleground(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), Battlefield::SpawnCreature(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_crusade_persuaded::npc_crusade_persuadedAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_professor_phizzlethorpe::npc_professor_phizzlethorpeAI::sQuestAccept(), npc_ranger_lilatha::sQuestAccept(), npc_corporal_keeshan::npc_corporal_keeshanAI::sQuestAccept(), npc_muglash::npc_muglashAI::sQuestAccept(), npc_wounded_blood_elf::npc_wounded_blood_elfAI::sQuestAccept(), FollowerAI::StartFollow(), pyrewood_ambush::pyrewood_ambushAI::SummonCreatureWithRandomTarget(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), Spell::SummonGuardian(), Player::SummonPet(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), WorldObject::SummonTrigger(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_aquementas::npc_aquementasAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), npc_sergeant_bly::npc_sergeant_blyAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_magister_aledis::UpdateAI(), npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI::UpdateAI(), Creature::UpdateEntry(), npc_magwin::npc_magwinAI::UpdateEscortAI(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ SetFeared()

void Unit::SetFeared ( bool  apply,
Unit fearedBy = nullptr,
bool  isFear = false 
)
protected
18288{
18289 if (apply)
18290 {
18291 SetTarget();
18292 GetMotionMaster()->MoveFleeing(fearedBy, isFear ? 0 : sWorld->getIntConfig(CONFIG_CREATURE_FAMILY_FLEE_DELAY));
18293 }
18294 else
18295 {
18296 if (IsAlive())
18297 {
18298 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == FLEEING_MOTION_TYPE)
18299 {
18301 StopMoving();
18302 }
18303
18304 if (GetVictim())
18306 }
18307 }
18308
18309 // xinef: block / allow control to real mover (eg. charmer)
18310 if (IsPlayer())
18311 {
18312 if (m_movedByPlayer)
18313 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18314 //else
18315 // ToPlayer()->SetClientControl(this, !apply);
18316 }
18317}
@ CONFIG_CREATURE_FAMILY_FLEE_DELAY
Definition: IWorld.h:284
@ FLEEING_MOTION_TYPE
Definition: MotionMaster.h:49
void MoveFleeing(Unit *enemy, uint32 time=0)
Enable the target's fleeing movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:746

References CONFIG_CREATURE_FAMILY_FLEE_DELAY, FLEEING_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), GetVictim(), IsAlive(), Object::IsPlayer(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveFleeing(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), StopMoving(), sWorld, and Object::ToPlayer().

Referenced by SetControlled().

◆ SetFeatherFall()

bool Unit::SetFeatherFall ( bool  enable,
bool  packetOnly = false 
)
virtual

Reimplemented in Player, and Creature.

20653{
20655 return false;
20656
20657 if (enable)
20659 else
20661
20662 return true;
20663}
@ MOVEMENTFLAG_FALLING_SLOW
Definition: UnitDefines.h:373

References AddUnitMovementFlag(), HasUnitMovementFlag(), MOVEMENTFLAG_FALLING_SLOW, and RemoveUnitMovementFlag().

Referenced by AuraEffect::HandleAuraFeatherFall(), debug_commandscript::HandleDebugMoveflagsCommand(), Player::SetFeatherFall(), and Creature::SetFeatherFall().

◆ SetFullHealth()

◆ SetHealth()

void Unit::SetHealth ( uint32  val)
15479{
15480 if (getDeathState() == DeathState::JustDied)
15481 val = 0;
15482 else if (IsPlayer() && getDeathState() == DeathState::Dead)
15483 val = 1;
15484 else
15485 {
15486 uint32 maxHealth = GetMaxHealth();
15487 if (maxHealth < val)
15488 val = maxHealth;
15489 }
15490
15491 float prevHealthPct = GetHealthPct();
15492
15494
15495 // mobs that are now or were below 30% need to update their speed
15496 if (IsCreature() && !(IsPet() && ToPet()->isControlled() && IsControlledByPlayer()) && (prevHealthPct < 30.0 || HealthBelowPct(30)))
15497 {
15498 UpdateSpeed(MOVE_RUN, false);
15499 }
15500
15501 // group update
15502 if (IsPlayer())
15503 {
15504 Player* player = ToPlayer();
15505 if (player->NeedSendSpectatorData())
15507
15508 if (player->GetGroup())
15510 }
15511 else if (Pet* pet = ToCreature()->ToPet())
15512 {
15513 if (pet->isControlled())
15514 {
15515 if (Unit* owner = GetOwner())
15516 if (Player* player = owner->ToPlayer())
15517 {
15518 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15519 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15520
15521 if (player->GetGroup())
15523 }
15524 }
15525 }
15526}
@ GROUP_UPDATE_FLAG_CUR_HP
Definition: Group.h:101
@ GROUP_UPDATE_FLAG_PET_CUR_HP
Definition: Group.h:113
void SendCommand_UInt32Value(T *o, ObjectGuid targetGUID, const char *prefix, uint32 t)
Definition: ArenaSpectator.h:62
bool NeedSendSpectatorData() const
Definition: Player.cpp:15407
void SetGroupUpdateFlag(uint32 flag)
Definition: Player.h:2457
float GetHealthPct() const
Definition: Unit.h:1031

References WorldObject::FindMap(), getDeathState(), Player::GetGroup(), Object::GetGUID(), GetHealthPct(), GetMaxHealth(), GetOwner(), GROUP_UPDATE_FLAG_CUR_HP, GROUP_UPDATE_FLAG_PET_CUR_HP, HealthBelowPct(), IsControlledByPlayer(), Object::IsCreature(), IsPet(), Object::IsPlayer(), MOVE_RUN, Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_FIELD_HEALTH, and UpdateSpeed().

Referenced by boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), Player::BuildPlayerRepop(), npc_mograine::npc_mograineAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_alar::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), DealDamage(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), Spell::EffectResurrectPet(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), Spell::EffectSummonType(), boss_prince_keleseth_icc::boss_prince_kelesethAI::EnterEvadeMode(), boss_prince_taldaram_icc::boss_prince_taldaramAI::EnterEvadeMode(), boss_prince_valanar_icc::boss_prince_valanarAI::EnterEvadeMode(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_oculus_soar_aura::HandleEffectPeriodic(), modify_commandscript::HandleModifyHPCommand(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcSetLevelCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), npc_echo_of_medivh::HandlePieceJustDied(), spell_stinky_precious_decimate::HandleScript(), spell_ahune_synch_health::HandleScript(), AuraEffect::HandleSpiritOfRedemption(), npc_pet_pri_lightwell::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustReachedHome(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustReachedHome(), boss_prince_valanar_icc::boss_prince_valanarAI::JustReachedHome(), npc_dirt_mound::JustSummoned(), boss_skeram::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_harbinger_skyriss::JustSummoned(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyHealth(), boss_grand_champion::boss_grand_championAI::MovementInform(), npc_nether_drake::npc_nether_drakeAI::MovementInform(), npc_corrupted_totem::npc_corrupted_totem(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), Player::ProcessDelayedOperations(), boss_vaelastrasz::boss_vaelAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), boss_prince_keleseth_icc::boss_prince_kelesethAI::Reset(), boss_prince_taldaram_icc::boss_prince_taldaramAI::Reset(), boss_prince_valanar_icc::boss_prince_valanarAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), boss_murmur::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Player::ResetAllPowers(), Player::RestoreHealthAfterDuel(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), Creature::SelectLevel(), setDeathState(), SetFullHealth(), SetMaxHealth(), boss_headless_horseman::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_malchezaar::SpellHitTarget(), npc_giant_claw_tentacle::Submerge(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), Creature::UpdateEntry(), and boss_twin_valkyrAI::UpdateSharedHealth().

◆ SetHover()

bool Unit::SetHover ( bool  enable,
bool  packetOnly = false,
bool  updateAnimationTier = true 
)
virtual

Reimplemented in Creature, and Player.

20675{
20677 return false;
20678
20679 float hoverHeight = GetFloatValue(UNIT_FIELD_HOVERHEIGHT);
20680
20681 if (enable)
20682 {
20684 if (hoverHeight && GetPositionZ() - GetFloorZ() < hoverHeight)
20685 UpdateHeight(GetPositionZ() + hoverHeight);
20686 }
20687 else
20688 {
20690 if (hoverHeight && (!isDying() || !IsCreature()))
20691 {
20692 float newZ = std::max<float>(GetFloorZ(), GetPositionZ() - hoverHeight);
20694 UpdateHeight(newZ);
20695 }
20696 SendMovementFlagUpdate(); // pussywizard: needed for falling after death (instead of falling onto air at hover height)
20697 }
20698
20699 return true;
20700}
void UpdateAllowedPositionZ(float x, float y, float &z, float *groundZ=nullptr) const
Definition: Object.cpp:1554
float GetFloorZ() const
Definition: Object.cpp:3135
void UpdateHeight(float newZ)
Only server-side height update, does not broadcast to client.
Definition: Unit.cpp:20072
void SendMovementFlagUpdate(bool self=false)
Definition: Unit.cpp:16705
bool isDying() const
Definition: Unit.h:1655

References AddUnitMovementFlag(), Object::GetFloatValue(), WorldObject::GetFloorZ(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), HasUnitMovementFlag(), Object::IsCreature(), isDying(), MOVEMENTFLAG_HOVER, RemoveUnitMovementFlag(), SendMovementFlagUpdate(), UNIT_FIELD_HOVERHEIGHT, WorldObject::UpdateAllowedPositionZ(), and UpdateHeight().

Referenced by AuraEffect::HandleAuraHover(), debug_commandscript::HandleDebugMoveflagsCommand(), setDeathState(), Creature::SetHover(), and Player::SetHover().

◆ SetImmuneToAll()

void Unit::SetImmuneToAll ( bool  apply,
bool  keepCombat = false 
)
inline
874{ SetImmuneToPC(apply, keepCombat); SetImmuneToNPC(apply, keepCombat); }
void SetImmuneToNPC(bool apply, bool keepCombat=false)
Definition: Unit.cpp:13620

References SetImmuneToNPC(), and SetImmuneToPC().

Referenced by spell_the_lich_king_trigger_vile_spirit::ActivateSpirit(), boss_chromaggus::boss_chromaggusAI::boss_chromaggusAI(), boss_nalorakk::boss_nalorakk(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_warden_mellichar::npc_warden_mellicharAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), boss_broggok::DoAction(), boss_grand_warlock_nethekurse::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_ambassador_hellmaw::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), boss_skeram::DoTeleport(), Spell::EffectSummonType(), npc_ghostly_priest::npc_ghostly_priestAI::EnterEvadeMode(), npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::EnterEvadeMode(), npc_spectral_footman::npc_spectral_footmanAI::EnterEvadeMode(), npc_tortured_rifleman::npc_tortured_riflemanAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), spell_uldaman_stoned_aura::HandleEffectApply(), spell_uldaman_stoned_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_item_draenic_pale_ale::HandleSummon(), boss_majordomo::boss_majordomoAI::InitializeAI(), boss_felblood_kaelthas::InitializeAI(), boss_captain_skarloc::InitializeAI(), boss_taldaram::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::InitializeAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::InitializeAI(), boss_prince_valanar_icc::boss_prince_valanarAI::InitializeAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), npc_lord_arete::npc_lord_areteAI::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::InitializeAI(), Player::InitStatsForLevel(), boss_falric::boss_falricAI::JustEngagedWith(), boss_marwyn::boss_marwynAI::JustEngagedWith(), boss_moroes::JustEngagedWith(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), npc_rinji::npc_rinjiAI::JustRespawned(), npc_isla_starmane::npc_isla_starmaneAI::JustRespawned(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_skeram::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), boss_felblood_kaelthas::MoveInLineOfSight(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), boss_nalorakk::MoveInLineOfSight(), boss_captain_skarloc::MovementInform(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_sister_svalna::boss_sister_svalnaAI::MovementInform(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MovementInform(), npc_enslaved_proto_drake::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_memory::npc_memoryAI::npc_memoryAI(), npc_rinji::npc_rinjiAI::npc_rinjiAI(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::npc_scarlet_miner_cartAI(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_felblood_kaelthas::Reset(), boss_mandokir::boss_mandokirAI::Reset(), boss_skeram::Reset(), boss_jedoga_shadowseeker::Reset(), boss_black_knight::boss_black_knightAI::Reset(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), boss_falric::boss_falricAI::Reset(), boss_marwyn::boss_marwynAI::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), boss_svala::boss_svalaAI::Reset(), npc_thassarian::npc_thassarianAI::Reset(), boss_ambassador_hellmaw::Reset(), boss_broggok::Reset(), boss_grand_warlock_nethekurse::Reset(), npc_warden_mellichar::npc_warden_mellicharAI::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), boss_svala::boss_svalaAI::SetData(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_chromaggus::boss_chromaggusAI::SetGUID(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_rinji::npc_rinjiAI::sQuestAccept(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_skeram::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_anzu::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), and npc_franklin::npc_franklinAI::UpdateAI().

◆ SetImmuneToNPC()

void Unit::SetImmuneToNPC ( bool  apply,
bool  keepCombat = false 
)

◆ SetImmuneToPC()

void Unit::SetImmuneToPC ( bool  apply,
bool  keepCombat = false 
)
13612{
13613 (void)keepCombat;
13614 if (apply)
13616 else
13618}

References RemoveUnitFlag(), SetUnitFlag(), and UNIT_FLAG_IMMUNE_TO_PC.

Referenced by boss_victor_nefarius::boss_victor_nefariusAI::BeginEvent(), boss_the_lich_king::boss_the_lich_kingAI::boss_the_lich_kingAI(), ClearInCombat(), npc_magister_aledis::DamageTaken(), boss_dorothee::DoAction(), boss_roar::DoAction(), boss_strawman::DoAction(), boss_tinhead::DoAction(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_coren_direbrew::DoAction(), npc_direbrew_antagonist::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_frozen_core::DoAction(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectRemove(), boss_blackheart_the_inciter::JustEngagedWith(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::JustSummoned(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), npc_omen::npc_omenAI::MovementInform(), npc_omen::npc_omenAI::npc_omenAI(), npc_death_knight_initiate::OnGossipSelect(), instance_ulduar::instance_ulduar_InstanceMapScript::OnPlayerEnter(), npc_kaya_flathoof::OnQuestAccept(), boss_doomrel::boss_doomrelAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_julianne::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), npc_a_special_surprise::npc_a_special_surpriseAI::Reset(), npc_coren_direbrew::Reset(), boss_general_zarithrian::boss_general_zarithrianAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), boss_gothik::boss_gothikAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_venture_co_straggler::npc_venture_co_stragglerAI::Reset(), boss_blackheart_the_inciter::Reset(), boss_magtheridon::Reset(), npc_magister_aledis::Reset(), boss_magtheridon::ScheduleCombatEvents(), SetImmuneToAll(), SetInCombatState(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_infernal_attacker::npc_infernal_attackerAI::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_magister_aledis::UpdateAI(), and npc_tallhorn_stag::npc_tallhorn_stagAI::UpdateAI().

◆ SetInCombatState()

void Unit::SetInCombatState ( bool  PvP,
Unit enemy = nullptr,
uint32  duration = 0 
)
13733{
13734 // only alive units can be in combat
13735 if (!IsAlive())
13736 return;
13737
13738 if (PvP)
13739 m_CombatTimer = std::max<uint32>(GetCombatTimer(), std::max<uint32>(5500, duration));
13740 else if (duration)
13741 m_CombatTimer = std::max<uint32>(GetCombatTimer(), duration);
13742
13744 return;
13745
13746 // xinef: if we somehow engage in combat (scripts, dunno) with player, remove this flag so he can fight back
13747 if (IsCreature() && enemy && IsImmuneToPC() && enemy->GetCharmerOrOwnerPlayerOrPlayerItself())
13748 SetImmuneToPC(false); // unit has engaged in combat, remove immunity so players can fight back
13749
13750 if (IsInCombat())
13751 return;
13752
13754
13755 if (Creature* creature = ToCreature())
13756 {
13757 // Set home position at place of engaging combat for escorted creatures
13758 if ((IsAIEnabled && creature->AI()->IsEscorted()) ||
13759 GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE ||
13760 GetMotionMaster()->GetCurrentMovementGeneratorType() == ESCORT_MOTION_TYPE)
13761 creature->SetHomePosition(GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
13762
13763 if (enemy)
13764 {
13765 creature->UpdateLeashExtensionTime();
13766
13767 if (IsAIEnabled)
13768 creature->AI()->JustEngagedWith(enemy);
13769
13770 if (creature->GetFormation())
13771 creature->GetFormation()->MemberEngagingTarget(creature, enemy);
13772
13773 sScriptMgr->OnUnitEnterCombat(creature, enemy);
13774 }
13775
13776 creature->RefreshSwimmingFlag();
13777
13778 if (IsPet())
13779 {
13780 UpdateSpeed(MOVE_RUN, true);
13781 UpdateSpeed(MOVE_SWIM, true);
13782 UpdateSpeed(MOVE_FLIGHT, true);
13783 }
13784
13785 if (!(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT))
13786 Dismount();
13787 if (!IsStandState()) // pussywizard: already done in CombatStart(target, initialAggro) for the target, but when aggro'ing from MoveInLOS CombatStart is not called!
13789 }
13790
13791 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
13792 {
13793 Unit* controlled = *itr;
13794 ++itr;
13795
13796 // Xinef: Dont set combat for passive units, they will evade in next update...
13797 if (controlled->IsCreature() && controlled->ToCreature()->HasReactState(REACT_PASSIVE))
13798 continue;
13799
13800 controlled->SetInCombatState(PvP, enemy, duration);
13801 }
13802
13803 if (Player* player = this->ToPlayer())
13804 {
13805 sScriptMgr->OnPlayerEnterCombat(player, enemy);
13806 }
13807}
@ CREATURE_TYPE_NON_COMBAT_PET
Definition: SharedDefines.h:2639
@ CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT
Definition: SharedDefines.h:2706
@ MOVE_FLIGHT
Definition: UnitDefines.h:334
@ MOVE_SWIM
Definition: UnitDefines.h:331
@ ESCORT_MOTION_TYPE
Definition: MotionMaster.h:57
@ WAYPOINT_MOTION_TYPE
Definition: MotionMaster.h:41
bool HasReactState(ReactStates state) const
Definition: Creature.h:96
uint32 GetCombatTimer() const
Definition: Unit.h:894
void SetInCombatState(bool PvP, Unit *enemy=nullptr, uint32 duration=0)
Definition: Unit.cpp:13732
bool IsStandState() const
Definition: Unit.cpp:16721

References CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT, CREATURE_TYPE_NON_COMBAT_PET, Dismount(), ESCORT_MOTION_TYPE, GetCharmerOrOwnerPlayerOrPlayerItself(), GetCombatTimer(), GetCreatureType(), GetMotionMaster(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Creature::HasReactState(), HasUnitState(), IsAIEnabled, IsAlive(), Object::IsCreature(), IsImmuneToPC(), IsInCombat(), IsPet(), IsStandState(), m_CombatTimer, m_Controlled, MOVE_FLIGHT, MOVE_RUN, MOVE_SWIM, REACT_PASSIVE, SetImmuneToPC(), SetInCombatState(), SetStandState(), SetUnitFlag(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_FLAG_IN_COMBAT, UNIT_STAND_STATE_STAND, UNIT_STATE_EVADE, UpdateSpeed(), and WAYPOINT_MOTION_TYPE.

Referenced by Spell::DoSpellHitOnUnit(), SetInCombatState(), and SetInCombatWith().

◆ SetInCombatWith()

void Unit::SetInCombatWith ( Unit enemy,
uint32  duration = 0 
)
13582{
13583 // Xinef: Dont allow to start combat with triggers
13584 if (enemy->IsCreature() && enemy->ToCreature()->IsTrigger())
13585 return;
13586
13587 Unit* eOwner = enemy->GetCharmerOrOwnerOrSelf();
13588 if (eOwner->IsPvP() || eOwner->IsFFAPvP())
13589 {
13590 SetInCombatState(true, enemy, duration);
13591 return;
13592 }
13593
13594 // check for duel
13595 if (eOwner->IsPlayer() && eOwner->ToPlayer()->duel)
13596 {
13597 Unit const* myOwner = GetCharmerOrOwnerOrSelf();
13598 if (((Player const*)eOwner)->duel->Opponent == myOwner)
13599 {
13600 SetInCombatState(true, enemy, duration);
13601 return;
13602 }
13603 }
13604
13605 if (Creature* pCreature = ToCreature())
13606 pCreature->UpdateLeashExtensionTime();
13607
13608 SetInCombatState(false, enemy, duration);
13609}

References Player::duel, GetCharmerOrOwnerOrSelf(), Object::IsCreature(), IsFFAPvP(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), SetInCombatState(), Object::ToCreature(), and Object::ToPlayer().

Referenced by Attack(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), CombatStart(), CombatStartOnCast(), npc_centrifuge_construct::npc_centrifuge_constructAI::DamageTaken(), Spell::DoAllEffectOnTarget(), CreatureAI::DoZoneInCombat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), spell_herald_volzaj_insanity::HandleDummyEffect(), boss_chromaggus::boss_chromaggusAI::PathEndReached(), SmartScript::ProcessAction(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), and npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI().

◆ SetInFront()

◆ SetInstantCast()

void Unit::SetInstantCast ( bool  set)
inline
1458{ _instantCast = set; }

References _instantCast.

Referenced by AuraEffect::HandleModCastingSpeed().

◆ SetLastDamagedTargetGuid()

void Unit::SetLastDamagedTargetGuid ( ObjectGuid const &  guid)
inline

◆ SetLastExtraAttackSpell()

void Unit::SetLastExtraAttackSpell ( uint32  spellId)
inline
953{ _lastExtraAttackSpell = spellId; }

References _lastExtraAttackSpell.

Referenced by Spell::_handle_finish_phase().

◆ SetLastManaUse()

void Unit::SetLastManaUse ( uint32  spellCastTime)
inline
1073{ m_lastManaUse = spellCastTime; }

References m_lastManaUse.

Referenced by Spell::TakePower().

◆ SetLevel()

◆ SetMaxHealth()

void Unit::SetMaxHealth ( uint32  val)
15529{
15530 if (!val)
15531 val = 1;
15532
15533 uint32 health = GetHealth();
15535
15536 // group update
15537 if (IsPlayer())
15538 {
15539 Player* player = ToPlayer();
15540 if (player->NeedSendSpectatorData())
15542
15543 if (player->GetGroup())
15545 }
15546 else if (Pet* pet = ToCreature()->ToPet())
15547 {
15548 if (pet->isControlled())
15549 {
15550 if (Unit* owner = GetOwner())
15551 if (Player* player = owner->ToPlayer())
15552 {
15553 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15554 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15555
15556 if (player->GetGroup())
15558 }
15559 }
15560 }
15561
15562 if (val < health)
15563 SetHealth(val);
15564}
@ GROUP_UPDATE_FLAG_MAX_HP
Definition: Group.h:102
@ GROUP_UPDATE_FLAG_PET_MAX_HP
Definition: Group.h:114

References WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetHealth(), GetOwner(), GROUP_UPDATE_FLAG_MAX_HP, GROUP_UPDATE_FLAG_PET_MAX_HP, Object::IsPlayer(), Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetHealth(), SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_MAXHEALTH.

Referenced by boss_xt002::boss_xt002AI::DoAction(), Spell::EffectSummonType(), modify_commandscript::HandleModifyHPCommand(), npc_commandscript::HandleNpcSetLevelCommand(), npc_pet_pri_lightwell::InitializeAI(), Player::InitStatsForLevel(), boss_skeram::JustSummoned(), npc_corrupted_totem::npc_corrupted_totem(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), Creature::SelectLevel(), npc_pet_hunter_snake_trap::UpdateAI(), Creature::UpdateMaxHealth(), Guardian::UpdateMaxHealth(), and Player::UpdateMaxHealth().

◆ SetMaxPower()

void Unit::SetMaxPower ( Powers  power,
uint32  val 
)
15632{
15633 uint32 cur_power = GetPower(power);
15634 SetStatInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power, val);
15635
15636 // group update
15637 if (IsPlayer())
15638 {
15639 Player* player = ToPlayer();
15640 if (getPowerType() == power && player->NeedSendSpectatorData())
15641 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15642
15643 if (player->GetGroup())
15645 }
15646 else if (Pet* pet = ToCreature()->ToPet())
15647 {
15648 if (pet->isControlled())
15649 {
15650 Unit* owner = GetOwner();
15651 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
15653 }
15654 }
15655
15656 if (val < cur_power)
15657 SetPower(power, val);
15658}
@ GROUP_UPDATE_FLAG_PET_MAX_POWER
Definition: Group.h:117
@ GROUP_UPDATE_FLAG_MAX_POWER
Definition: Group.h:105
void SetStatInt32Value(uint16 index, int32 value)
Definition: Object.cpp:798

References WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetOwner(), GetPower(), getPowerType(), GROUP_UPDATE_FLAG_MAX_POWER, GROUP_UPDATE_FLAG_PET_MAX_POWER, Object::IsPlayer(), Player::NeedSendSpectatorData(), POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetPower(), Object::SetStatInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_MAXPOWER1.

Referenced by Player::Create(), Pet::CreateBaseAtTamed(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), Creature::SelectLevel(), setPowerType(), Creature::UpdateMaxPower(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ SetMinion()

void Unit::SetMinion ( Minion minion,
bool  apply 
)
10686{
10687 LOG_DEBUG("entities.unit", "SetMinion {} for {}, apply {}", minion->GetEntry(), GetEntry(), apply);
10688
10689 if (apply)
10690 {
10691 if (minion->GetOwnerGUID())
10692 {
10693 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10694 return;
10695 }
10696
10697 minion->SetOwnerGUID(GetGUID());
10698
10699 m_Controlled.insert(minion);
10700
10701 if (IsPlayer())
10702 {
10703 minion->m_ControlledByPlayer = true;
10705 }
10706
10707 // Can only have one pet. If a new one is summoned, dismiss the old one.
10708 if (minion->IsGuardianPet())
10709 {
10710 if (Guardian* oldPet = GetGuardianPet())
10711 {
10712 if (oldPet != minion && (oldPet->IsPet() || minion->IsPet() || oldPet->GetEntry() != minion->GetEntry()))
10713 {
10714 // remove existing minion pet
10715 if (Pet* oldPetAsPet = oldPet->ToPet())
10716 {
10717 oldPetAsPet->Remove(PET_SAVE_NOT_IN_SLOT);
10718 }
10719 else
10720 {
10721 oldPet->UnSummon();
10722 }
10723
10724 SetPetGUID(minion->GetGUID());
10726 }
10727 }
10728 else
10729 {
10730 SetPetGUID(minion->GetGUID());
10732 }
10733 }
10734
10736 {
10738 }
10739
10740 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10741 {
10742 SetCritterGUID(minion->GetGUID());
10743 }
10744
10745 // PvP, FFAPvP
10747
10748 // Ghoul pets have energy instead of mana (is anywhere better place for this code?)
10749 if (minion->IsPetGhoul() || minion->GetEntry() == 24207 /*ENTRY_ARMY_OF_THE_DEAD*/)
10750 minion->setPowerType(POWER_ENERGY);
10751
10752 if (IsPlayer())
10753 {
10754 // Send infinity cooldown - client does that automatically but after relog cooldown needs to be set again
10755 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
10756
10757 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
10758 ToPlayer()->AddSpellAndCategoryCooldowns(spellInfo, 0, nullptr, true);
10759 }
10760 }
10761 else
10762 {
10763 if (minion->GetOwnerGUID() != GetGUID())
10764 {
10765 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10766 return;
10767 }
10768
10769 m_Controlled.erase(minion);
10770
10771 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10772 {
10773 if (GetCritterGUID() == minion->GetGUID())
10775 }
10776
10777 if (minion->IsGuardianPet())
10778 {
10779 if (GetPetGUID() == minion->GetGUID())
10781 }
10782 else if (minion->IsTotem())
10783 {
10784 // All summoned by totem minions must disappear when it is removed.
10785 if (SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(minion->ToTotem()->GetSpell()))
10786 {
10787 for (int i = 0; i < MAX_SPELL_EFFECTS; ++i)
10788 {
10789 if (spInfo->Effects[i].Effect != SPELL_EFFECT_SUMMON)
10790 continue;
10791
10792 RemoveAllMinionsByEntry(spInfo->Effects[i].MiscValue);
10793 }
10794 }
10795 }
10796
10797 if (IsPlayer())
10798 {
10799 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
10800 // Remove infinity cooldown
10801 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
10802 ToPlayer()->SendCooldownEvent(spellInfo);
10803
10804 // xinef: clear spell book
10805 if (m_Controlled.empty())
10807 }
10808
10809 //if (minion->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
10810 {
10812 {
10813 // Check if there is another minion
10814 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10815 {
10816 // do not use this check, creature do not have charm guid
10817 //if (GetCharmGUID() == (*itr)->GetGUID())
10818 if (GetGUID() == (*itr)->GetCharmerGUID())
10819 continue;
10820
10821 //ASSERT((*itr)->GetOwnerGUID() == GetGUID());
10822 if ((*itr)->GetOwnerGUID() != GetGUID())
10823 {
10824 OutDebugInfo();
10825 (*itr)->OutDebugInfo();
10826 ABORT();
10827 }
10828 ASSERT((*itr)->IsCreature());
10829
10830 if (!(*itr)->HasUnitTypeMask(UNIT_MASK_CONTROLABLE_GUARDIAN))
10831 continue;
10832
10833 if (AddGuidValue(UNIT_FIELD_SUMMON, (*itr)->GetGUID()))
10834 {
10835 // show another pet bar if there is no charm bar
10836 if (IsPlayer() && !GetCharmGUID())
10837 {
10838 if ((*itr)->IsPet())
10840 else
10842 }
10843 }
10844 break;
10845 }
10846 }
10847 }
10848 }
10849}
@ SPELL_EFFECT_SUMMON
Definition: SharedDefines.h:806
@ SUMMON_TYPE_MINIPET
Definition: SharedDefines.h:3299
@ PET_SAVE_NOT_IN_SLOT
Definition: PetDefines.h:45
const SummonPropertiesEntry *const m_Properties
Definition: TemporarySummon.h:63
bool IsGuardianPet() const
Definition: TemporarySummon.cpp:390
bool IsPetGhoul() const
Definition: TemporarySummon.h:84
void PetSpellInitialize()
Definition: Player.cpp:9478
uint32 GetSpell(uint8 slot=0) const
Definition: Totem.h:59
void OutDebugInfo() const
Definition: Unit.cpp:20235
ObjectGuid GetCritterGUID() const
Definition: Unit.h:690
void SetOwnerGUID(ObjectGuid owner)
Definition: Unit.cpp:10573
void SetCritterGUID(ObjectGuid guid)
Definition: Unit.h:689
void setPowerType(Powers power)
Definition: Unit.cpp:9979
void RemoveAllMinionsByEntry(uint32 entry)
Definition: Unit.cpp:10863
uint32 Type
Definition: DBCStructure.h:1912

References ABORT, Object::AddGuidValue(), Player::AddSpellAndCategoryCooldowns(), ASSERT, Player::CharmSpellInitialize(), ObjectGuid::Empty, Object::GetByteValue(), GetCharmGUID(), GetCritterGUID(), Object::GetEntry(), GetGuardianPet(), Object::GetGUID(), GetOwnerGUID(), GetPetGUID(), Totem::GetSpell(), Object::GetUInt32Value(), HasUnitTypeMask(), SpellInfo::IsCooldownStartedOnEvent(), Minion::IsGuardianPet(), IsPet(), Minion::IsPetGhoul(), Object::IsPlayer(), IsTotem(), LOG_DEBUG, LOG_FATAL, m_Controlled, m_ControlledByPlayer, TempSummon::m_Properties, MAX_SPELL_EFFECTS, OutDebugInfo(), PET_SAVE_NOT_IN_SLOT, Player::PetSpellInitialize(), POWER_ENERGY, RemoveAllMinionsByEntry(), Object::RemoveGuidValue(), Player::SendCooldownEvent(), Player::SendRemoveControlBar(), Object::SetByteValue(), SetCritterGUID(), SetMinionGUID(), SetOwnerGUID(), SetPetGUID(), setPowerType(), SetUnitFlag(), SPELL_EFFECT_SUMMON, sSpellMgr, SUMMON_TYPE_MINIPET, ToPet(), Object::ToPlayer(), ToTotem(), SummonPropertiesEntry::Type, UNIT_CREATED_BY_SPELL, UNIT_FIELD_BYTES_2, UNIT_FIELD_SUMMON, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_CONTROLABLE_GUARDIAN.

Referenced by Player::CreatePet(), Spell::EffectCreateTamedPet(), Spell::EffectTameCreature(), Pet::LoadPetFromDB(), Player::RemovePet(), and Player::SummonPet().

◆ SetMinionGUID()

void Unit::SetMinionGUID ( ObjectGuid  guid)
inline

◆ SetModelVisible()

◆ SetModifierValue()

◆ SetNativeDisplayId()

◆ SetNpcFlag()

void Unit::SetNpcFlag ( NPCFlags  flags)
inline
726{ SetFlag(UNIT_NPC_FLAGS, flags); }

References Object::SetFlag(), and UNIT_NPC_FLAGS.

Referenced by Vehicle::AddPassenger(), npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_majordomo::boss_majordomoAI::InitializeAI(), npc_sergeant_bly::npc_sergeant_blyAI::InitializeAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::InitializeAI(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::JustReachedHome(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_fairbanks::npc_fairbanksAI::MoveInLineOfSight(), npc_chesspiece::MovementInform(), npc_fos_leader_second::npc_fos_leader_secondAI::MovementInform(), npc_pos_leader_second::npc_pos_leader_secondAI::MovementInform(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::MovementInform(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::MovementInform(), npc_chesspiece::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_akama_illidan::PathEndReached(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), Vehicle::RemovePassenger(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::ReorderInstance(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), npc_hyjal_jaina::hyjalJainaAI::Reset(), npc_hyjal_thrall::hyjalThrallAI::Reset(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::Reset(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_crusade_recruit::npc_crusade_recruitAI::Reset(), npc_akama_illidan::Reset(), npc_akama_shade::Reset(), npc_magister_aledis::Reset(), Vehicle::Reset(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::ResetData(), NPCStaveQuestAI::ResetState(), boss_majordomo::boss_majordomoAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), Vehicle::Vehicle(), npc_arthas::npc_arthasAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), npc_general_andorov::WaypointReached(), and npc_cork_gizelton::npc_cork_gizeltonAI::WaypointReached().

◆ SetOwnerGUID()

void Unit::SetOwnerGUID ( ObjectGuid  owner)
10574{
10575 if (GetOwnerGUID() == owner)
10576 return;
10577
10579 if (!owner)
10580 return;
10581
10582 m_applyResilience = !IsVehicle() && owner.IsPlayer();
10583
10584 // Update owner dependent fields
10585 Player* player = ObjectAccessor::GetPlayer(*this, owner);
10586 if (!player || !player->HaveAtClient(this)) // if player cannot see this unit yet, he will receive needed data with create object
10587 return;
10588
10590
10591 UpdateData udata;
10592 WorldPacket packet;
10593 BuildValuesUpdateBlockForPlayer(&udata, player);
10594 udata.BuildPacket(packet);
10595 player->SendDirectMessage(&packet);
10596
10598}
void BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition: Object.cpp:257
void RemoveFieldNotifyFlag(uint16 flag)
Definition: Object.h:192
void SetFieldNotifyFlag(uint16 flag)
Definition: Object.h:191
Definition: UpdateData.h:52
bool BuildPacket(WorldPacket &packet)
Definition: UpdateData.cpp:48
bool HaveAtClient(WorldObject const *u) const
Definition: Player.cpp:11419

References UpdateData::BuildPacket(), Object::BuildValuesUpdateBlockForPlayer(), GetOwnerGUID(), ObjectAccessor::GetPlayer(), Player::HaveAtClient(), ObjectGuid::IsPlayer(), IsVehicle(), m_applyResilience, Object::RemoveFieldNotifyFlag(), Player::SendDirectMessage(), Object::SetFieldNotifyFlag(), Object::SetGuidValue(), UF_FLAG_OWNER, and UNIT_FIELD_SUMMONEDBY.

Referenced by GameObject::CastSpell(), Spell::EffectSummonType(), boss_illidari_council_memberAI::EnterEvadeMode(), spell_item_draenic_pale_ale::HandleSummon(), npc_pet_gen_fetch_ball::IsSummonedBy(), boss_razorgore::boss_razorgoreAI::JustSummoned(), Player::LoadFromDB(), SetMinion(), and npc_grimstone::npc_grimstoneAI::UpdateEscortAI().

◆ SetPetGUID()

◆ SetPhaseMask()

void Unit::SetPhaseMask ( uint32  newPhaseMask,
bool  update 
)
overridevirtual

Reimplemented from WorldObject.

19051{
19052 if (newPhaseMask == GetPhaseMask())
19053 return;
19054
19055 if (IsInWorld())
19056 {
19057 // xinef: to comment, bellow line should be removed
19058 // pussywizard: goign to other phase (valithria, algalon) should not remove such auras
19059 //RemoveNotOwnSingleTargetAuras(newPhaseMask, true); // we can lost access to caster or target
19060
19061 if (!sScriptMgr->CanSetPhaseMask(this, newPhaseMask, update))
19062 return;
19063
19064 // modify hostile references for new phasemask, some special cases deal with hostile references themselves
19065 if (IsCreature() || (!ToPlayer()->IsGameMaster() && !ToPlayer()->GetSession()->PlayerLogout()))
19066 {
19067 HostileRefMgr& refMgr = getHostileRefMgr();
19068 HostileReference* ref = refMgr.getFirst();
19069
19070 while (ref)
19071 {
19072 if (Unit* unit = ref->GetSource()->GetOwner())
19073 if (Creature* creature = unit->ToCreature())
19074 refMgr.setOnlineOfflineState(creature, creature->InSamePhase(newPhaseMask));
19075
19076 ref = ref->next();
19077 }
19078
19079 // modify threat lists for new phasemask
19080 if (!IsPlayer())
19081 {
19084
19085 // merge expects sorted lists
19086 threatList.sort();
19087 offlineThreatList.sort();
19088 threatList.merge(offlineThreatList);
19089
19090 for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr)
19091 if (Unit* unit = (*itr)->getTarget())
19092 unit->getHostileRefMgr().setOnlineOfflineState(ToCreature(), unit->InSamePhase(newPhaseMask));
19093 }
19094 }
19095 }
19096
19097 WorldObject::SetPhaseMask(newPhaseMask, false);
19098
19099 if (!IsInWorld())
19100 {
19101 return;
19102 }
19103
19104 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); )
19105 {
19106 Unit* controlled = *itr;
19107 ++itr;
19108 if (controlled->IsCreature())
19109 {
19110 controlled->SetPhaseMask(newPhaseMask, true);
19111 }
19112 }
19113
19114 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
19115 {
19116 if (m_SummonSlot[i])
19117 {
19118 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
19119 {
19120 summon->SetPhaseMask(newPhaseMask, true);
19121 }
19122 }
19123 }
19124
19125 if (update)
19126 {
19128 }
19129}
FROM * GetSource() const
Definition: Reference.h:97
Definition: HostileRefMgr.h:31
void setOnlineOfflineState(bool isOnline)
Definition: HostileRefMgr.cpp:98
HostileReference * getFirst()
Definition: HostileRefMgr.h:59
HostileReference * next()
Definition: ThreatMgr.h:115
ThreatContainer::StorageType const & GetOfflineThreatList() const
Definition: ThreatMgr.h:274
Unit * GetOwner() const
Definition: ThreatMgr.h:236
virtual void SetPhaseMask(uint32 newPhaseMask, bool update)
Definition: Object.cpp:2875
uint32 GetPhaseMask() const
Definition: Object.h:446
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition: Unit.cpp:19050

References HostileRefMgr::getFirst(), getHostileRefMgr(), WorldObject::GetMap(), ThreatMgr::GetOfflineThreatList(), ThreatMgr::GetOwner(), WorldObject::GetPhaseMask(), Reference< TO, FROM >::GetSource(), ThreatMgr::GetThreatList(), GetThreatMgr(), WorldObject::InSamePhase(), Object::IsCreature(), Object::IsInWorld(), Object::IsPlayer(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, HostileReference::next(), HostileRefMgr::setOnlineOfflineState(), WorldObject::SetPhaseMask(), SetPhaseMask(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), and UpdateObjectVisibility().

Referenced by Pet::Create(), Creature::Create(), misc_commandscript::HandleAppearCommand(), modify_commandscript::HandleModifyPhaseCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), spell_wintergrasp_hide_small_elementals_aura::HandlePeriodicDummy(), AuraEffect::HandlePhase(), Battlefield::HideNpc(), boss_volazj::InitializeAI(), boss_zuramat::boss_zuramatAI::JustSummoned(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::JustSummoned(), BattlegroundAB::RemovePlayer(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_twilight_halion::boss_twilight_halionAI::Reset(), Creature::setDeathState(), Player::SetGameMaster(), SetPhaseMask(), Battlefield::ShowNpc(), WorldObject::SummonTrigger(), and npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached().

◆ SetPower()

void Unit::SetPower ( Powers  power,
uint32  val,
bool  withPowerUpdate = true,
bool  fromRegenerate = false 
)
15567{
15568 if (!fromRegenerate && GetPower(power) == val)
15569 {
15570 return;
15571 }
15572
15573 uint32 maxPower = GetMaxPower(power);
15574 if (maxPower < val)
15575 {
15576 val = maxPower;
15577 }
15578
15579 if (fromRegenerate)
15580 {
15581 UpdateUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, val);
15583 }
15584 else
15585 {
15586 SetStatInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, val);
15587 }
15588
15589 if (withPowerUpdate)
15590 {
15592 data << GetPackGUID();
15593 data << uint8(power);
15594 data << uint32(val);
15595 SendMessageToSet(&data, IsPlayer());
15596 }
15597
15598 // group update
15599 if (IsPlayer())
15600 {
15601 Player* player = ToPlayer();
15602 if (getPowerType() == power && player->NeedSendSpectatorData())
15603 {
15604 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15605 }
15606
15607 if (player->GetGroup())
15608 {
15610 }
15611 }
15612 else if (Pet* pet = ToCreature()->ToPet())
15613 {
15614 if (pet->isControlled())
15615 {
15616 Unit* owner = GetOwner();
15617 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
15618 {
15620 }
15621 }
15622
15623 // Update the pet's character sheet with happiness damage bonus
15624 if (pet->getPetType() == HUNTER_PET && power == POWER_HAPPINESS)
15625 {
15626 pet->UpdateDamagePhysical(BASE_ATTACK);
15627 }
15628 }
15629}
@ GROUP_UPDATE_FLAG_PET_CUR_POWER
Definition: Group.h:116
@ GROUP_UPDATE_FLAG_CUR_POWER
Definition: Group.h:104
@ SMSG_POWER_UPDATE
Definition: Opcodes.h:1182
void UpdateUInt32Value(uint16 index, uint32 value)
Definition: Object.cpp:663
void AddToObjectUpdateIfNeeded()
Definition: Object.cpp:524

References Object::AddToObjectUpdateIfNeeded(), BASE_ATTACK, WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), Object::GetPackGUID(), GetPower(), getPowerType(), GROUP_UPDATE_FLAG_CUR_POWER, GROUP_UPDATE_FLAG_PET_CUR_POWER, HUNTER_PET, Object::IsPlayer(), Player::NeedSendSpectatorData(), POWER_HAPPINESS, POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), WorldObject::SendMessageToSet(), Player::SetGroupUpdateFlag(), Object::SetStatInt32Value(), SMSG_POWER_UPDATE, Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_FIELD_POWER1, and Object::UpdateUInt32Value().

Referenced by Player::ActivateSpec(), Player::Create(), Pet::CreateBaseAtTamed(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), Player::GiveLevel(), AuraEffect::HandleAuraModShapeshift(), spell_warr_execute::HandleEffect(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), WorldSession::HandlePetAbandon(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), boss_shade_of_aran::OnPowerUpdate(), Player::ProcessDelayedOperations(), Player::Regenerate(), spell_igb_incinerating_blast::RemoveEnergy(), spell_igb_below_zero::RemovePassengers(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_selin_fireheart::Reset(), boss_moam::Reset(), npc_obsidian_destroyer::Reset(), npc_obsidian_eradicator::Reset(), npc_obsidian_nullifier::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::RestoreManaAfterDuel(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), Creature::SelectLevel(), setDeathState(), SetMaxPower(), setPowerType(), Player::SummonPet(), and npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI().

◆ setPowerType()

void Unit::setPowerType ( Powers  power)
9980{
9981 SetByteValue(UNIT_FIELD_BYTES_0, 3, new_powertype);
9982
9983 if (IsPlayer())
9984 {
9985 if (ToPlayer()->GetGroup())
9987 }
9988 else if (Pet* pet = ToCreature()->ToPet())
9989 {
9990 if (pet->isControlled())
9991 {
9992 Unit* owner = GetOwner();
9993 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
9995 }
9996 }
9997
9998 float powerMultiplier = 1.0f;
9999 if (!IsPet())
10000 if (Creature* creature = ToCreature())
10001 powerMultiplier = creature->GetCreatureTemplate()->ModMana;
10002
10003 switch (new_powertype)
10004 {
10005 default:
10006 case POWER_MANA:
10007 break;
10008 case POWER_RAGE:
10009 SetMaxPower(POWER_RAGE, uint32(std::ceil(GetCreatePowers(POWER_RAGE) * powerMultiplier)));
10010 SetPower(POWER_RAGE, 0);
10011 break;
10012 case POWER_FOCUS:
10013 SetMaxPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
10014 SetPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
10015 break;
10016 case POWER_ENERGY:
10017 SetMaxPower(POWER_ENERGY, uint32(std::ceil(GetCreatePowers(POWER_ENERGY) * powerMultiplier)));
10018 break;
10019 case POWER_HAPPINESS:
10020 SetMaxPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
10021 SetPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
10022 break;
10023 }
10024
10025 if (Player const* player = ToPlayer())
10026 if (player->NeedSendSpectatorData())
10027 {
10028 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "PWT", new_powertype);
10029 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetMaxPower(new_powertype) / 10 : GetMaxPower(new_powertype));
10030 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetPower(new_powertype) / 10 : GetPower(new_powertype));
10031 }
10032}
@ GROUP_UPDATE_FLAG_POWER_TYPE
Definition: Group.h:103
@ GROUP_UPDATE_FLAG_PET_POWER_TYPE
Definition: Group.h:115
void SetMaxPower(Powers power, uint32 val)
Definition: Unit.cpp:15631

References WorldObject::FindMap(), GetCreatePowers(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), GetPower(), GROUP_UPDATE_FLAG_PET_POWER_TYPE, GROUP_UPDATE_FLAG_POWER_TYPE, IsPet(), Object::IsPlayer(), POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Object::SetByteValue(), Player::SetGroupUpdateFlag(), SetMaxPower(), SetPower(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_BYTES_0.

Referenced by Pet::CreateBaseAtTamed(), AuraEffect::HandleAuraModShapeshift(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitDataForForm(), Vehicle::Install(), Pet::LoadPetFromDB(), npc_toc_rogue::npc_toc_rogueAI::npc_toc_rogueAI(), SetMinion(), and Player::SummonPet().

◆ SetPvP()

◆ setRace()

void Unit::setRace ( uint8  race)
21021{
21022 if (IsPlayer())
21023 m_race = race;
21024}

References Object::IsPlayer(), and m_race.

◆ SetRedirectThreat()

void Unit::SetRedirectThreat ( ObjectGuid  guid,
uint32  pct 
)
inline
910{ _redirectThreatInfo.Set(guid, pct); }
void Set(ObjectGuid guid, uint32 pct)
Definition: ThreatMgr.h:301

References _redirectThreatInfo, and RedirectThreatInfo::Set().

Referenced by Spell::EffectRedirectThreat(), and ResetRedirectThreat().

◆ SetResistance()

◆ SetResistanceBuffMods()

void Unit::SetResistanceBuffMods ( SpellSchools  school,
bool  positive,
float  val 
)
inline

◆ SetRooted()

void Unit::SetRooted ( bool  apply,
bool  isStun = false 
)
protected
18206{
18207 if (apply)
18208 {
18209 if (m_rootTimes > 0) // blizzard internal check?
18210 m_rootTimes++;
18211
18212 // MOVEMENTFLAG_ROOT cannot be used in conjunction with MOVEMENTFLAG_MASK_MOVING (tested 3.3.5a)
18213 // this will freeze clients. That's why we remove MOVEMENTFLAG_MASK_MOVING before
18214 // setting MOVEMENTFLAG_ROOT
18216
18217 if (IsFalling())
18218 {
18220 }
18221 else
18222 {
18224 }
18225
18226 // Creature specific
18227 if (!IsPlayer())
18228 {
18229 if (isStun && movespline->Finalized())
18230 {
18232 }
18233 else
18234 {
18235 StopMoving();
18236 }
18237 }
18238
18239 if (m_movedByPlayer)
18240 {
18241 WorldPacket data(SMSG_FORCE_MOVE_ROOT, GetPackGUID().size() + 4);
18242 data << GetPackGUID();
18243 data << m_rootTimes;
18245 }
18246 else
18247 {
18249 data << GetPackGUID();
18250 SendMessageToSet(&data, true);
18251 }
18252 }
18253 else
18254 {
18256
18257 if (!HasUnitState(UNIT_STATE_STUNNED)) // prevent moving if it also has stun effect
18258 {
18259 if (m_movedByPlayer)
18260 {
18262 data << GetPackGUID();
18263 data << m_rootTimes;
18265 }
18266 else
18267 {
18269 data << GetPackGUID();
18270 SendMessageToSet(&data, true);
18271 }
18272 }
18273 }
18274}
@ MOVEMENTFLAG_PENDING_ROOT
Definition: UnitDefines.h:364
@ SMSG_FORCE_MOVE_UNROOT
Definition: Opcodes.h:264
@ SMSG_FORCE_MOVE_ROOT
Definition: Opcodes.h:262
@ SMSG_SPLINE_MOVE_ROOT
Definition: Opcodes.h:824
void StopMovingOnCurrentPos()
Definition: Unit.cpp:16690

References AddUnitMovementFlag(), Movement::MoveSpline::Finalized(), Object::GetPackGUID(), HasUnitState(), IsFalling(), Object::IsPlayer(), m_movedByPlayer, m_rootTimes, MOVEMENTFLAG_MASK_MOVING, MOVEMENTFLAG_PENDING_ROOT, MOVEMENTFLAG_ROOT, movespline, RemoveUnitMovementFlag(), Player::SendDirectMessage(), WorldObject::SendMessageToSet(), SMSG_FORCE_MOVE_ROOT, SMSG_FORCE_MOVE_UNROOT, SMSG_SPLINE_MOVE_ROOT, SMSG_SPLINE_MOVE_UNROOT, StopMoving(), StopMovingOnCurrentPos(), Object::ToPlayer(), and UNIT_STATE_STUNNED.

Referenced by WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), SetControlled(), and SetStunned().

◆ SetShapeshiftForm()

void Unit::SetShapeshiftForm ( ShapeshiftForm  form)
inline

◆ SetSheath()

◆ SetSpeed()

void Unit::SetSpeed ( UnitMoveType  mtype,
float  rate,
bool  forced = false 
)
14430{
14431 if (rate < 0)
14432 rate = 0.0f;
14433
14434 // Update speed only on change
14435 if (m_speed_rate[mtype] == rate)
14436 return;
14437
14438 m_speed_rate[mtype] = rate;
14439
14441
14442 WorldPacket data;
14443 if (!forced)
14444 {
14445 switch (mtype)
14446 {
14447 case MOVE_WALK:
14448 data.Initialize(MSG_MOVE_SET_WALK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14449 break;
14450 case MOVE_RUN:
14451 data.Initialize(MSG_MOVE_SET_RUN_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14452 break;
14453 case MOVE_RUN_BACK:
14454 data.Initialize(MSG_MOVE_SET_RUN_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14455 break;
14456 case MOVE_SWIM:
14457 data.Initialize(MSG_MOVE_SET_SWIM_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14458 break;
14459 case MOVE_SWIM_BACK:
14460 data.Initialize(MSG_MOVE_SET_SWIM_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14461 break;
14462 case MOVE_TURN_RATE:
14463 data.Initialize(MSG_MOVE_SET_TURN_RATE, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14464 break;
14465 case MOVE_FLIGHT:
14466 data.Initialize(MSG_MOVE_SET_FLIGHT_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14467 break;
14468 case MOVE_FLIGHT_BACK:
14469 data.Initialize(MSG_MOVE_SET_FLIGHT_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14470 break;
14471 case MOVE_PITCH_RATE:
14472 data.Initialize(MSG_MOVE_SET_PITCH_RATE, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14473 break;
14474 default:
14475 LOG_ERROR("entities.unit", "Unit::SetSpeed: Unsupported move type ({}), data not sent to client.", mtype);
14476 return;
14477 }
14478
14479 data << GetPackGUID();
14480 BuildMovementPacket(&data);
14481 data << float(GetSpeed(mtype));
14482 SendMessageToSet(&data, true);
14483 }
14484 else
14485 {
14486 if (IsPlayer())
14487 {
14488 // register forced speed changes for WorldSession::HandleForceSpeedChangeAck
14489 // and do it only for real sent packets and use run for run/mounted as client expected
14490 ++ToPlayer()->m_forced_speed_changes[mtype];
14491
14492 // Xinef: update speed of pet also
14493 if (!IsInCombat())
14494 {
14495 Unit* pet = ToPlayer()->GetPet();
14496 if (!pet)
14497 pet = GetCharm();
14498
14499 // xinef: do not affect vehicles and possesed pets
14500 if (pet && (pet->HasUnitFlag(UNIT_FLAG_POSSESSED) || pet->IsVehicle()))
14501 pet = nullptr;
14502
14503 if (pet && pet->IsCreature() && !pet->IsInCombat() && pet->GetMotionMaster()->GetCurrentMovementGeneratorType() == FOLLOW_MOTION_TYPE)
14504 pet->UpdateSpeed(mtype, forced);
14505 if (Unit* critter = ObjectAccessor::GetUnit(*this, GetCritterGUID()))
14506 critter->UpdateSpeed(mtype, forced);
14507 }
14508 ToPlayer()->SetCanTeleport(true);
14509 }
14510
14511 switch (mtype)
14512 {
14513 case MOVE_WALK:
14515 break;
14516 case MOVE_RUN:
14518 break;
14519 case MOVE_RUN_BACK:
14521 break;
14522 case MOVE_SWIM:
14524 break;
14525 case MOVE_SWIM_BACK:
14527 break;
14528 case MOVE_TURN_RATE:
14530 break;
14531 case MOVE_FLIGHT:
14533 break;
14534 case MOVE_FLIGHT_BACK:
14536 break;
14537 case MOVE_PITCH_RATE:
14539 break;
14540 default:
14541 LOG_ERROR("entities.unit", "Unit::SetSpeed: Unsupported move type ({}), data not sent to client.", mtype);
14542 return;
14543 }
14544 data << GetPackGUID();
14545 data << (uint32)0; // moveEvent, NUM_PMOVE_EVTS = 0x39
14546 if (mtype == MOVE_RUN)
14547 data << uint8(0); // new 2.1.0
14548 data << float(GetSpeed(mtype));
14549 SendMessageToSet(&data, true);
14550 }
14551}
@ MOVE_TURN_RATE
Definition: UnitDefines.h:333
@ MOVE_FLIGHT_BACK
Definition: UnitDefines.h:335
@ MOVE_SWIM_BACK
Definition: UnitDefines.h:332
@ MOVE_PITCH_RATE
Definition: UnitDefines.h:336
@ MOVE_RUN_BACK
Definition: UnitDefines.h:330
@ MOVE_WALK
Definition: UnitDefines.h:328
@ FOLLOW_MOTION_TYPE
Definition: MotionMaster.h:54
@ SMSG_FORCE_TURN_RATE_CHANGE
Definition: Opcodes.h:764
@ MSG_MOVE_SET_SWIM_BACK_SPEED
Definition: Opcodes.h:243
@ MSG_MOVE_SET_TURN_RATE
Definition: Opcodes.h:246
@ SMSG_FORCE_WALK_SPEED_CHANGE
Definition: Opcodes.h:760
@ SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE
Definition: Opcodes.h:929
@ MSG_MOVE_SET_PITCH_RATE
Definition: Opcodes.h:1145
@ SMSG_FORCE_RUN_SPEED_CHANGE
Definition: Opcodes.h:256
@ SMSG_FORCE_SWIM_BACK_SPEED_CHANGE
Definition: Opcodes.h:762
@ SMSG_FORCE_RUN_BACK_SPEED_CHANGE
Definition: Opcodes.h:258
@ SMSG_FORCE_FLIGHT_SPEED_CHANGE
Definition: Opcodes.h:927
@ SMSG_FORCE_SWIM_SPEED_CHANGE
Definition: Opcodes.h:260
@ MSG_MOVE_SET_RUN_SPEED
Definition: Opcodes.h:235
@ MSG_MOVE_SET_FLIGHT_SPEED
Definition: Opcodes.h:924
@ MSG_MOVE_SET_WALK_SPEED
Definition: Opcodes.h:239
@ MSG_MOVE_SET_SWIM_SPEED
Definition: Opcodes.h:241
@ MSG_MOVE_SET_FLIGHT_BACK_SPEED
Definition: Opcodes.h:926
@ SMSG_FORCE_PITCH_RATE_CHANGE
Definition: Opcodes.h:1146
@ MSG_MOVE_SET_RUN_BACK_SPEED
Definition: Opcodes.h:237
uint8 m_forced_speed_changes[MAX_MOVE_TYPE]
Definition: Player.h:2383
float GetSpeed(UnitMoveType mtype) const
Definition: Unit.cpp:14424
void propagateSpeedChange()
Definition: Unit.h:1605
MovementGeneratorType GetCurrentMovementGeneratorType() const
Definition: MotionMaster.cpp:913

References BuildMovementPacket(), FOLLOW_MOTION_TYPE, GetCharm(), GetCritterGUID(), MotionMaster::GetCurrentMovementGeneratorType(), GetMotionMaster(), Object::GetPackGUID(), Player::GetPet(), GetSpeed(), ObjectAccessor::GetUnit(), HasUnitFlag(), WorldPacket::Initialize(), Object::IsCreature(), IsInCombat(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, Player::m_forced_speed_changes, m_speed_rate, MOVE_FLIGHT, MOVE_FLIGHT_BACK, MOVE_PITCH_RATE, MOVE_RUN, MOVE_RUN_BACK, MOVE_SWIM, MOVE_SWIM_BACK, MOVE_TURN_RATE, MOVE_WALK, MSG_MOVE_SET_FLIGHT_BACK_SPEED, MSG_MOVE_SET_FLIGHT_SPEED, MSG_MOVE_SET_PITCH_RATE, MSG_MOVE_SET_RUN_BACK_SPEED, MSG_MOVE_SET_RUN_SPEED, MSG_MOVE_SET_SWIM_BACK_SPEED, MSG_MOVE_SET_SWIM_SPEED, MSG_MOVE_SET_TURN_RATE, MSG_MOVE_SET_WALK_SPEED, propagateSpeedChange(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE, SMSG_FORCE_FLIGHT_SPEED_CHANGE, SMSG_FORCE_PITCH_RATE_CHANGE, SMSG_FORCE_RUN_BACK_SPEED_CHANGE, SMSG_FORCE_RUN_SPEED_CHANGE, SMSG_FORCE_SWIM_BACK_SPEED_CHANGE, SMSG_FORCE_SWIM_SPEED_CHANGE, SMSG_FORCE_TURN_RATE_CHANGE, SMSG_FORCE_WALK_SPEED_CHANGE, Object::ToPlayer(), UNIT_FLAG_POSSESSED, and UpdateSpeed().

Referenced by Battleground::AddCreature(), boss_bug_trio::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::FlyAway(), boss_volkhan::boss_volkhanAI::GoToAnvil(), misc_commandscript::HandleDismountCommand(), spell_mount_check_aura::HandleEffectPeriodic(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), WorldSession::HandleForceSpeedChangeAck(), modify_commandscript::HandleModifyASpeedCommand(), modify_commandscript::HandleModifyMountCommand(), Creature::InitEntry(), boss_glob_of_viscidus::InitializeAI(), Guardian::InitStatsForLevel(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), boss_sartharion_dragonAI::JustEngagedWith(), boss_four_horsemen::boss_four_horsemenAI::JustEngagedWith(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_sartharion::boss_sartharionAI::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::MountSelf(), boss_onyxia::MovementInform(), boss_bug_trio::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_akilzon_eagle::MovementInform(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), npc_ancestral_wolf::npc_ancestral_wolfAI::npc_ancestral_wolfAI(), npc_batrider::npc_batrider(), npc_hallows_end_soh::npc_hallows_end_soh(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), npc_eastvale_peasent::PathEndReached(), SmartScript::ProcessAction(), boss_nightbane::Reset(), boss_kalec::Reset(), npc_zuljin_vortex::Reset(), boss_headless_horseman::Reset(), boss_onyxia::Reset(), boss_bug_trio::Reset(), boss_sartharion_dragonAI::Reset(), boss_sindragosa::boss_sindragosaAI::Reset(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::Reset(), boss_volkhan::boss_volkhanAI::Reset(), boss_thorim_sif_blizzard::boss_thorim_sif_blizzardAI::Reset(), npc_wild_wyrm::npc_wild_wyrmAI::Reset(), npc_freed_protodrake::npc_freed_protodrakeAI::Reset(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), npc_eastvale_peasent::SetData(), Battlefield::SpawnCreature(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UnMountSelf(), npc_akilzon_eagle::UpdateAI(), boss_onyxia::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::UpdateAI(), UpdateSpeed(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetSpeedRate()

◆ SetStandFlags()

◆ SetStandState()

void Unit::SetStandState ( uint8  state)
16728{
16730
16731 if (IsStandState())
16733
16734 if (IsPlayer())
16735 {
16737 data << (uint8)state;
16738 ToPlayer()->GetSession()->SendPacket(&data);
16739 }
16740}
@ UNIT_BYTES_1_OFFSET_STAND_STATE
Definition: UnitDefines.h:23
@ SMSG_STANDSTATE_UPDATE
Definition: Opcodes.h:699

References AURA_INTERRUPT_FLAG_NOT_SEATED, Player::GetSession(), Object::IsPlayer(), IsStandState(), RemoveAurasWithInterruptFlags(), WorldSession::SendPacket(), Object::SetByteValue(), SMSG_STANDSTATE_UPDATE, Object::ToPlayer(), UNIT_BYTES_1_OFFSET_STAND_STATE, and UNIT_FIELD_BYTES_1.

Referenced by _ApplyAura(), npc_mograine::npc_mograineAI::AshbringerEvent(), boss_felmyst::boss_felmyst(), boss_kologarn::boss_kologarnAI::boss_kologarnAI(), boss_twinemperorsAI::boss_twinemperorsAI(), boss_thekal::CheckPhaseTransition(), npc_ringo::npc_ringoAI::ClearFaint(), npc_kerlonian::npc_kerlonianAI::ClearSleeping(), CombatStart(), npc_vrykul_skeleton::DamageTaken(), boss_alar::DamageTaken(), boss_thekal::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_nightbane::DoAction(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_the_lurker_below::DoAction(), boss_leotheras_the_blind::DoAction(), npc_madrigosa::DoAction(), boss_illidan_stormrage::DoAction(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::DoAction(), npc_taretha::npc_tarethaAI::DoAction(), Spell::DoAllEffectOnTarget(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), boss_ahune::Emerge(), UtherBatteredHiltEvent::Execute(), SuckBackEvent::Execute(), boss_ahune::ExecuteEvent(), boss_ingvar_the_plunderer::FeignDeath(), WorldSession::HandleAlterAppearance(), WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandleMovementOpcodes(), WorldSession::HandlePlayerLoginFromDB(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStandStateChangeOpcode(), spell_q11322_q11317_the_cleansing::if(), DistractMovementGenerator::Initialize(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), boss_kalecgos::JustEngagedWith(), boss_palehoof::boss_palehoofAI::JustReachedHome(), npc_massive_jormungar::npc_massive_jormungarAI::JustReachedHome(), npc_ferocious_rhino::npc_ferocious_rhinoAI::JustReachedHome(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::JustReachedHome(), npc_frenzied_worgen::npc_frenzied_worgenAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::JustSummoned(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::JustSummoned(), npc_mograine::npc_mograineAI::MoveInLineOfSight(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_kologarn::boss_kologarnAI::MoveInLineOfSight(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::MoveInLineOfSight(), npc_twilight_volunteer::MovementInform(), boss_mr_smite::boss_mr_smiteAI::MovementInform(), npc_madrigosa::npc_madrigosa(), spell_love_is_in_the_air_romantic_picnic::OnApply(), boss_shade_of_aran::OnPowerUpdate(), npc_kernobee::OnQuestAccept(), npc_koltira_deathweaver::OnQuestAccept(), npc_kerlonian::OnQuestAccept(), npc_gilthares::OnQuestAccept(), npc_ringo::OnQuestAccept(), npc_maghar_captive::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_bonker_togglevolt::OnQuestAccept(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), Spell::prepare(), PretendToDie(), boss_alar::PretendToDie(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_vaelastrasz::boss_vaelAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_kalecgos::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_thekal::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::Reset(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::Reset(), boss_anubarak_trial::boss_anubarak_trialAI::Reset(), boss_professor_putricide::boss_professor_putricideAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::Reset(), boss_illidan_stormrage::Reset(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::Reset(), boss_leotheras_the_blind::Reset(), boss_the_lurker_below::Reset(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::Reset(), Resurrect(), boss_the_lurker_below::SchedulerPhaseOne(), boss_the_lurker_below::SchedulerPhaseTwo(), npc_ringo::npc_ringoAI::SetFaint(), npc_kurenai_captive::npc_kurenai_captiveAI::SetGUID(), SetInCombatState(), npc_kerlonian::npc_kerlonianAI::SetSleeping(), SetStunned(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_harrison_jones::SpellHit(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), advisor_baseAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), boss_felmyst::StartIntro(), boss_ahune::Submerge(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_eachother(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_Pathaleons_Image(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_corporal_keeshan::npc_corporal_keeshanAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_forest_frog::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_tallhorn_stag::npc_tallhorn_stagAI::UpdateAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), GameObject::Use(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetStat()

void Unit::SetStat ( Stats  stat,
int32  val 
)
inline

◆ SetStunned()

void Unit::SetStunned ( bool  apply)
protected
18158{
18160 {
18161 return;
18162 }
18163
18164 if (apply)
18165 {
18166 SetTarget();
18168
18169 if (IsPlayer())
18170 {
18172 }
18173
18174 SetRooted(true, true);
18175
18176 CastStop();
18177 }
18178 else
18179 {
18180 if (IsAlive() && GetVictim())
18182
18183 if (IsCreature())
18184 {
18185 // don't remove UNIT_FLAG_STUNNED for pet when owner is mounted (disabled pet's interface)
18186 Unit* owner = GetOwner();
18187 if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted())
18189
18190 // Xinef: same for charmed npcs
18191 owner = GetCharmer();
18192 if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted())
18194 }
18195 else
18197
18198 if (!HasUnitState(UNIT_STATE_ROOT)) // prevent moving if it also has root effect
18199 {
18200 SetRooted(false, true);
18201 }
18202 }
18203}

References CastStop(), GetCharmer(), Object::GetGUID(), GetOwner(), GetVictim(), HasUnitState(), IsAlive(), Object::IsCreature(), IsMounted(), Object::IsPlayer(), RemoveUnitFlag(), SetRooted(), SetStandState(), SetTarget(), SetUnitFlag(), Object::ToPlayer(), UNIT_FLAG_STUNNED, UNIT_STAND_STATE_STAND, UNIT_STATE_IN_FLIGHT, and UNIT_STATE_ROOT.

Referenced by SetControlled().

◆ SetSwim()

bool Unit::SetSwim ( bool  enable)
virtual

◆ SetTarget()

virtual void Unit::SetTarget ( ObjectGuid  = ObjectGuid::Empty)
pure virtual

◆ setTransForm()

void Unit::setTransForm ( uint32  spellid)
inline
1830{ m_transform = spellid;}

References m_transform.

Referenced by AuraEffect::HandleAuraTransform().

◆ SetUInt32Value()

void Unit::SetUInt32Value ( uint16  index,
uint32  value 
)
21318{
21319 Object::SetUInt32Value(index, value);
21320
21321 switch (index)
21322 {
21323 // Invalidating the cache on health change should fix an issue where the client sees dead NPCs when they are not.
21324 // We might also need to invalidate the cache for some other fields as well.
21325 case UNIT_FIELD_HEALTH:
21327 break;
21328 }
21329}
void SetUInt32Value(uint16 index, uint32 value)
Definition: Object.cpp:650
void InvalidateValuesUpdateCache()
Definition: Unit.h:2091

References InvalidateValuesUpdateCache(), Object::SetUInt32Value(), and UNIT_FIELD_HEALTH.

Referenced by Player::_LoadDailyQuestStatus(), Player::_LoadSkills(), Player::AddItemToBuyBackSlot(), Attack(), Player::CheckAreaExploreAndOutdoor(), Spell::CheckItems(), Player::Create(), Pet::CreateBaseAtTamed(), Player::CreatePet(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), Dismount(), npc_harrison_jones::DoAction(), boss_thekal::DoAction(), boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_pathaleon_the_calculator::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_illidan_stormrage::DoAction(), Player::DuelComplete(), Spell::EffectSummonPet(), Spell::EffectTameCreature(), boss_jindo::EnterEvadeMode(), boss_zuljin::EnterPhase(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), Player::GiveLevel(), Pet::GivePetLevel(), Pet::GivePetXP(), Player::GiveXP(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraTransform(), character_commandscript::HandleCharacterLevel(), debug_commandscript::HandleDebugMod32ValueCommand(), debug_commandscript::HandleDebugUpdateCommand(), spell_dk_dancing_rune_weapon_visual::HandleEffectApply(), spell_gen_model_visible::HandleEffectApply(), spell_gen_model_visible::HandleEffectRemove(), spell_gen_baby_murloc::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), misc_commandscript::HandleHideAreaCommand(), modify_commandscript::HandleModifyStandStateCommand(), modify_commandscript::HandleMorphMountCommand(), WorldSession::HandleMovementOpcodes(), AuraEffect::HandleNoReagentUseAura(), npc_commandscript::HandleNpcPlayEmoteCommand(), WorldSession::HandlePetRename(), reset_commandscript::HandleResetHonorCommand(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), WorldSession::HandleSelfResOpcode(), WorldSession::HandleSetTitleOpcode(), WorldSession::HandleSetWatchedFactionOpcode(), misc_commandscript::HandleShowAreaCommand(), WorldSession::HandleTextEmoteOpcode(), titles_commandscript::HandleTitlesCurrentCommand(), titles_commandscript::HandleTitlesRemoveCommand(), titles_commandscript::HandleTitlesSetMaskCommand(), Player::InitGlyphsForLevel(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::Initialize(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), InitTamedPet(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::JustDied(), boss_xt002::boss_xt002AI::JustEngagedWith(), npc_dragonflayer_forge_master::JustEngagedWith(), boss_jindo::JustEngagedWith(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_akama_illidan::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), Kill(), Creature::LoadCreaturesAddon(), Creature::LoadEquipment(), Player::LoadFromDB(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), Player::ModifySkillBonus(), Mount(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MoveInLineOfSight(), npc_harrison_jones::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), npc_tirion_fordring_tft::npc_tirion_fordringAI::MovementInform(), npc_akama_illidan::MovementInform(), npc_thassarian2::npc_thassarian2AI::MovementInform(), npc_apothecary_genericAI::MovementInform(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::npc_pos_martin_or_gorkun_secondAI(), spell_gen_clone_weapon_aura::OnApply(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_ame::OnQuestAccept(), go_crystalline_tear::OnQuestAccept(), spell_gen_clone_weapon_aura::OnRemove(), npc_eastvale_peasent::PathEndReached(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), Player::RemoveAmmo(), Player::RemoveItemFromBuyBackSlot(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::ReorderInstance(), ReplaceAllDynamicFlags(), ReplaceAllNpcFlags(), Player::ReplaceAllPlayerFlags(), ReplaceAllUnitFlags(), ReplaceAllUnitFlags2(), boss_ragnaros::boss_ragnarosAI::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_zuljin::Reset(), boss_arlokk::boss_arlokkAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), npc_hor_leader::npc_hor_leaderAI::Reset(), boss_malygos::boss_malygosAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_amberpine_woodsman::npc_amberpine_woodsmanAI::Reset(), npc_crusade_recruit::npc_crusade_recruitAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Player::ResetDailyQuestStatus(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), Spell::SendChannelStart(), Spell::SendChannelUpdate(), Player::SetAmmo(), Player::SetArenaPoints(), Player::SetArenaTeamInfoField(), SetCharmedBy(), SetCreateHealth(), SetCreateMana(), Player::SetCurrentTitle(), Player::SetDailyQuestStatus(), npc_ulduar_vx001::npc_ulduar_vx001AI::SetData(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::SetData(), npc_eastvale_peasent::SetData(), setDeathState(), Player::setDeathState(), SetDisplayId(), SetFaction(), Player::SetFreePrimaryProfessions(), Player::SetFreeTalentPoints(), Player::SetGlyph(), Player::SetGlyphSlot(), SetHealth(), Player::SetHonorPoints(), Player::SetInGuild(), SetLevel(), SetMaxHealth(), Player::SetMoney(), SetNativeDisplayId(), CharmInfo::SetPetNumber(), Player::SetQuestSlot(), Player::SetQuestSlotTimer(), Player::SetRank(), Player::SetRestBonus(), Player::SetSkill(), SetVirtualItem(), Player::SetVisibleItemSlot(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Map::SummonCreature(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), Player::SummonPet(), Player::SwapQuestSlot(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_amberpine_woodsman::npc_amberpine_woodsmanAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), Player::UpdateArmorPenetration(), Player::UpdateDuelFlag(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), Player::UpdateExpertise(), Player::UpdateHonorFields(), Player::UpdateRating(), Player::UpdateShieldBlockValue(), Player::UpdateSkill(), Player::UpdateSkillPro(), Player::UpdateSkillsForLevel(), Player::UpdateSkillsToMaxSkillsForLevel(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached(), and npc_ranger_lilatha::WaypointReached().

◆ SetUnitFlag()

void Unit::SetUnitFlag ( UnitFlags  flags)
inline

UnitFlags available in UnitDefines.h.

713{ SetFlag(UNIT_FIELD_FLAGS, flags); }

References Object::SetFlag(), and UNIT_FIELD_FLAGS.

Referenced by BattlegroundAV::AddAVCreature(), Vehicle::AddPassenger(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::AddPortals(), Creature::AllLootRemovedFromCorpse(), npc_doctor::npc_doctorAI::BeginEvent(), boss_jarien::boss_jarien(), boss_sothos::boss_sothos(), GameObject::CastSpell(), Player::Create(), npc_mograine::npc_mograineAI::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_muru::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), advisor_baseAI::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Deactivate(), DisableRotate(), boss_thorim::boss_thorimAI::DisableThorim(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), npc_amanishi_lookout::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_frozen_core::DoAction(), boss_felmyst::DoAction(), boss_kalecgos::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_illidan_stormrage::DoAction(), PetAI::DoAttack(), FlightPathMovementGenerator::DoReset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_erekem::boss_erekemAI::EnterEvadeMode(), boss_ichoron::boss_ichoronAI::EnterEvadeMode(), boss_lavanthor::boss_lavanthorAI::EnterEvadeMode(), boss_moragg::boss_moraggAI::EnterEvadeMode(), boss_xevozz::boss_xevozzAI::EnterEvadeMode(), boss_zuramat::boss_zuramatAI::EnterEvadeMode(), boss_anubarak_trial::boss_anubarak_trialAI::EnterEvadeMode(), boss_jaraxxus::boss_jaraxxusAI::EnterEvadeMode(), boss_gormok::boss_gormokAI::EnterEvadeMode(), boss_jormungarAI::EnterEvadeMode(), boss_icehowl::boss_icehowlAI::EnterEvadeMode(), SACDeactivateEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), boss_ingvar_the_plunderer::FeignDeath(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_gen_model_visible::HandleEffectApply(), spell_gen_feign_death_all_flags::HandleEffectApply(), spell_gen_feign_death_no_dyn_flag::HandleEffectApply(), spell_gen_feign_death_no_prevent_emotes::HandleEffectApply(), AuraEffect::HandleFeignDeath(), BattlefieldWG::HandleKill(), Battleground::HandleKillPlayer(), WorldSession::HandleLogoutRequestOpcode(), spell_oculus_rider_aura::HandleOnEffectApply(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_malchezaar_axe::Initialize(), npc_captured_beryl_sorcerer::npc_captured_beryl_sorcererAI::Initialize(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::InitializeAI(), boss_kiljaeden::InitializeAI(), npc_general_andorov::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), Player::InitStatsForLevel(), boss_kologarn::boss_kologarnAI::JustDied(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustEngagedWith(), boss_mimiron::boss_mimironAI::JustEngagedWith(), boss_felmyst::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_gothik::boss_gothikAI::JustEngagedWith(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::JustSummoned(), boss_hazzarah::JustSummoned(), boss_vaelastrasz::boss_vaelAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Mount(), npc_shattered_hand_scout::MoveInLineOfSight(), boss_kaelthas::MoveInLineOfSight(), npc_batrider::npc_batrider(), npc_blade_of_azzinoth::npc_blade_of_azzinoth(), npc_chess_move_trigger::npc_chess_move_trigger(), npc_hol_monument::npc_hol_monumentAI::npc_hol_monumentAI(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::npc_mageguard_dalaranAI(), npc_pos_freed_slave::npc_pos_freed_slaveAI::npc_pos_freed_slaveAI(), npc_q24545_vegard::npc_q24545_vegardAI::npc_q24545_vegardAI(), npc_xt002_heart::npc_xt002_heartAI::npc_xt002_heartAI(), spell_halion_twilight_phasing_aura::OnApply(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_dire_maul::instance_dire_maul_InstanceMapScript::OnCreatureCreate(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), boss_alar::PretendToDie(), Creature::RefreshSwimmingFlag(), boss_keristrasza::RemovePrison(), npc_grimstone::npc_grimstoneAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_nefarian::Reset(), boss_nightbane::Reset(), npc_death_knight_initiate::npc_death_knight_initiateAI::Reset(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), npc_zuljin_vortex::Reset(), npc_hallows_end_soh::Reset(), npc_ancient_wisp::Reset(), boss_cthun::Reset(), npc_depth_charge::npc_depth_chargeAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), npc_death_ravager::npc_death_ravagerAI::Reset(), npc_giant_spotlight::npc_giant_spotlightAI::Reset(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::Reset(), boss_jedoga_shadowseeker::Reset(), boss_black_knight::boss_black_knightAI::Reset(), npc_announcer_toc5::npc_announcer_toc5AI::Reset(), boss_anubarak_trial::boss_anubarak_trialAI::Reset(), boss_novos::boss_novosAI::Reset(), boss_tyrannus::boss_tyrannusAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_malygos::boss_malygosAI::Reset(), boss_eregos::boss_eregosAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_sjonnir::boss_sjonnirAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_massive_jormungar::npc_massive_jormungarAI::Reset(), npc_ferocious_rhino::npc_ferocious_rhinoAI::Reset(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::Reset(), npc_frenzied_worgen::npc_frenzied_worgenAI::Reset(), boss_ymiron::boss_ymironAI::Reset(), npc_drakuru_shackles::npc_drakuru_shacklesAI::Reset(), boss_shade_of_akama::Reset(), boss_leotheras_the_blind::Reset(), boss_the_lurker_below::Reset(), boss_warlord_kalithresh::Reset(), boss_broggok::Reset(), boss_kelidan_the_breaker::Reset(), boss_magtheridon::Reset(), boss_kaelthas::Reset(), npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::Reset(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), boss_the_lurker_below::SchedulerPhaseOne(), Player::SendLoot(), SetCharm(), SetCharmedBy(), SetImmuneToNPC(), SetImmuneToPC(), SetInCombatState(), Player::SetIsSpectator(), SetMinion(), SetStunned(), SetSwim(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), Battlefield::ShowNpc(), npc_netherspite_infernal::SpellHit(), npc_harrison_jones::SpellHit(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), npc_nether_drake::npc_nether_drakeAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_ionar::boss_ionarAI::Split(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_lord_valthalak::boss_lord_valthalakAI::StartTalking(), npc_giant_claw_tentacle::Submerge(), boss_ouro::Submerge(), boss_ahune::Submerge(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_madrigosa::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), npc_blistering_zombie::npc_blistering_zombieAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_azure_saboteur::npc_azure_saboteurAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and Creature::UpdateEntry().

◆ SetUnitFlag2()

◆ SetUnitMovementFlags()

◆ SetVirtualItem()

void Unit::SetVirtualItem ( uint32  slot,
uint32  itemId 
)
21177{
21178 if (slot >= MAX_EQUIPMENT_ITEMS)
21179 return;
21180
21182}

References MAX_EQUIPMENT_ITEMS, SetUInt32Value(), and UNIT_VIRTUAL_ITEM_SLOT_ID.

Referenced by ScriptedAI::SetEquipmentSlots().

◆ SetVisible()

void Unit::SetVisible ( bool  x)
14233{
14234 if (!x)
14236 else
14238
14240}
@ SEC_GAMEMASTER
Definition: Common.h:59

References WorldObject::m_serverSideVisibility, SEC_GAMEMASTER, SEC_PLAYER, SERVERSIDE_VISIBILITY_GM, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and UpdateObjectVisibility().

Referenced by boss_felmyst::boss_felmyst(), Creature::Create(), boss_muru::DamageTaken(), boss_alar::DamageTaken(), spell_rotface_unstable_ooze_explosion_suicide_aura::DespawnSelf(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), boss_archimonde::DoAction(), boss_felmyst::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::EnterEvadeMode(), HideNpcEvent::Execute(), UtherBatteredHiltEvent::Execute(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::FinishQuest(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), BattlegroundSA::HandleKillUnit(), Battlefield::HideNpc(), boss_kiljaeden::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), npc_xt002_heart::npc_xt002_heartAI::JustDied(), boss_kalecgos::JustReachedHome(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::JustReachedHome(), SmartAI::JustRespawned(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), boss_hazzarah::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::MovementInform(), boss_vazruden_the_herald::MovementInform(), npc_shattered_hand_scout::MovementInform(), npc_madrigosa::npc_madrigosa(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::npc_time_lost_proto_drakeAI(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnCreatureCreate(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::OnCreatureCreate(), instance_forge_of_souls::instance_forge_of_souls_InstanceScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_pit_of_saron::instance_pit_of_saron_InstanceScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::PassengerBoarded(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_midnight::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::Reset(), boss_muru::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_archimonde::Reset(), boss_eye_of_cthun::Reset(), npc_murkdeep::npc_murkdeepAI::Reset(), npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::Reset(), boss_halion::boss_halionAI::Reset(), npc_pos_leader::npc_pos_leaderAI::Reset(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::Reset(), boss_ionar::boss_ionarAI::Reset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::Reset(), npc_minigob_manabonk::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), boss_vazruden_the_herald::Reset(), npc_enslaved_netherwing_drake::Reset(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SetData(), Battlefield::ShowNpc(), boss_ionar::boss_ionarAI::Split(), boss_warchief_kargath_bladefist::SummonedCreatureDies(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), npc_commander_dawnforge::npc_commander_dawnforgeAI::UpdateAI(), SmartAI::UpdateDespawn(), npc_grimstone::npc_grimstoneAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), and npc_taretha::npc_tarethaAI::WaypointReached().

◆ SetVisibleAura()

void Unit::SetVisibleAura ( uint8  slot,
AuraApplication aur 
)
inline

◆ SetWalk()

bool Unit::SetWalk ( bool  enable)
virtual

Reimplemented in Creature.

20552{
20553 if (enable == IsWalking())
20554 return false;
20555
20556 if (enable)
20558 else
20560
20562 return true;
20563}
bool IsWalking() const
Definition: Unit.h:1574

References AddUnitMovementFlag(), IsWalking(), MOVEMENTFLAG_WALKING, propagateSpeedChange(), and RemoveUnitMovementFlag().

Referenced by debug_commandscript::HandleDebugMoveflagsCommand(), SetCharm(), and Creature::SetWalk().

◆ SetWaterWalking()

bool Unit::SetWaterWalking ( bool  enable,
bool  packetOnly = false 
)
virtual

Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players.

Reimplemented in Player, and Creature.

20631{
20633 return false;
20634
20635 if (enable)
20637 else
20639
20640 return true;
20641}
@ MOVEMENTFLAG_WATERWALKING
Definition: UnitDefines.h:372

References AddUnitMovementFlag(), HasUnitMovementFlag(), MOVEMENTFLAG_WATERWALKING, and RemoveUnitMovementFlag().

Referenced by AuraEffect::HandleAuraWaterWalk(), debug_commandscript::HandleDebugMoveflagsCommand(), Player::SetWaterWalking(), and Creature::SetWaterWalking().

◆ SpellBaseDamageBonusDone()

int32 Unit::SpellBaseDamageBonusDone ( SpellSchoolMask  schoolMask)
11938{
11939 int32 DoneAdvertisedBenefit = 0;
11940
11942 for (AuraEffectList::const_iterator i = mDamageDone.begin(); i != mDamageDone.end(); ++i)
11943 if (((*i)->GetMiscValue() & schoolMask) != 0 &&
11944 (*i)->GetSpellInfo()->EquippedItemClass == -1 &&
11945 // -1 == any item class (not wand then)
11946 (*i)->GetSpellInfo()->EquippedItemInventoryTypeMask == 0)
11947 // 0 == any inventory type (not wand then)
11948 DoneAdvertisedBenefit += (*i)->GetAmount();
11949
11950 if (IsPlayer())
11951 {
11952 // Base value
11953 DoneAdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
11954
11955 // Damage bonus from stats
11957 for (AuraEffectList::const_iterator i = mDamageDoneOfStatPercent.begin(); i != mDamageDoneOfStatPercent.end(); ++i)
11958 {
11959 if ((*i)->GetMiscValue() & schoolMask)
11960 {
11961 // stat used stored in miscValueB for this aura
11962 Stats usedStat = Stats((*i)->GetMiscValueB());
11963 DoneAdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
11964 }
11965 }
11966 // ... and attack power
11968 for (AuraEffectList::const_iterator i = mDamageDonebyAP.begin(); i != mDamageDonebyAP.end(); ++i)
11969 if ((*i)->GetMiscValue() & schoolMask)
11970 DoneAdvertisedBenefit += int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), (*i)->GetAmount()));
11971 }
11972 return DoneAdvertisedBenefit;
11973}
@ SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER
Definition: SpellAuraDefines.h:300
@ SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT
Definition: SpellAuraDefines.h:237
@ SPELL_AURA_MOD_DAMAGE_DONE
Definition: SpellAuraDefines.h:76
uint32 GetBaseSpellPowerBonus()
Definition: Player.h:1954

References BASE_ATTACK, CalculatePct(), GetAuraEffectsByType(), Player::GetBaseSpellPowerBonus(), GetStat(), GetTotalAttackPowerValue(), Object::IsPlayer(), SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, and Object::ToPlayer().

Referenced by spell_item_wraith_scythe_drain_life::CalculateDamage(), spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), Spell::EffectWeaponDmg(), spell_warl_life_tap::HandleDummy(), HandleDummyAuraProc(), spell_pal_seal_of_righteousness::HandleProc(), SpellDamageBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellBaseDamageBonusTaken()

int32 Unit::SpellBaseDamageBonusTaken ( SpellSchoolMask  schoolMask,
bool  isDoT = false 
)
11976{
11977 int32 TakenAdvertisedBenefit = 0;
11978
11980 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
11981 if (((*i)->GetMiscValue() & schoolMask) != 0)
11982 {
11983 // Xinef: if we have DoT damage type and aura has charges, check if it affects DoTs
11984 // Xinef: required for hemorrhage & rupture / garrote
11985 if (isDoT && (*i)->GetBase()->IsUsingCharges() && !((*i)->GetSpellInfo()->ProcFlags & PROC_FLAG_TAKEN_PERIODIC))
11986 continue;
11987
11988 TakenAdvertisedBenefit += (*i)->GetAmount();
11989 }
11990
11991 return TakenAdvertisedBenefit;
11992}

References GetAuraEffectsByType(), PROC_FLAG_TAKEN_PERIODIC, and SPELL_AURA_MOD_DAMAGE_TAKEN.

Referenced by HandleDummyAuraProc(), spell_pal_seal_of_righteousness::HandleProc(), and SpellDamageBonusTaken().

◆ SpellBaseHealingBonusDone()

int32 Unit::SpellBaseHealingBonusDone ( SpellSchoolMask  schoolMask)
12703{
12704 int32 AdvertisedBenefit = 0;
12705
12707 for (AuraEffectList::const_iterator i = mHealingDone.begin(); i != mHealingDone.end(); ++i)
12708 if (!(*i)->GetMiscValue() || ((*i)->GetMiscValue() & schoolMask) != 0)
12709 AdvertisedBenefit += (*i)->GetAmount();
12710
12711 // Healing bonus of spirit, intellect and strength
12712 if (IsPlayer())
12713 {
12714 // Base value
12715 AdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
12716
12717 // Healing bonus from stats
12719 for (AuraEffectList::const_iterator i = mHealingDoneOfStatPercent.begin(); i != mHealingDoneOfStatPercent.end(); ++i)
12720 {
12721 // stat used dependent from misc value (stat index)
12722 Stats usedStat = Stats((*i)->GetSpellInfo()->Effects[(*i)->GetEffIndex()].MiscValue);
12723 AdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
12724 }
12725
12726 // ... and attack power
12728 for (AuraEffectList::const_iterator i = mHealingDonebyAP.begin(); i != mHealingDonebyAP.end(); ++i)
12729 if ((*i)->GetMiscValue() & schoolMask)
12730 AdvertisedBenefit += int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), (*i)->GetAmount()));
12731 }
12732 return AdvertisedBenefit;
12733}
@ SPELL_AURA_MOD_HEALING_DONE
Definition: SpellAuraDefines.h:198
@ SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT
Definition: SpellAuraDefines.h:238
@ SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER
Definition: SpellAuraDefines.h:301

References BASE_ATTACK, CalculatePct(), GetAuraEffectsByType(), Player::GetBaseSpellPowerBonus(), GetStat(), GetTotalAttackPowerValue(), Object::IsPlayer(), SPELL_AURA_MOD_HEALING_DONE, SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT, and Object::ToPlayer().

Referenced by CalculateSpellAmount(), SpellHealingBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellBaseHealingBonusTaken()

int32 Unit::SpellBaseHealingBonusTaken ( SpellSchoolMask  schoolMask)
12736{
12737 int32 AdvertisedBenefit = 0;
12738
12740 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
12741 if (((*i)->GetMiscValue() & schoolMask) != 0)
12742 AdvertisedBenefit += (*i)->GetAmount();
12743
12744 return AdvertisedBenefit;
12745}
@ SPELL_AURA_MOD_HEALING
Definition: SpellAuraDefines.h:178

References GetAuraEffectsByType(), and SPELL_AURA_MOD_HEALING.

Referenced by SpellHealingBonusTaken().

◆ SpellCriticalDamageBonus()

uint32 Unit::SpellCriticalDamageBonus ( Unit const *  caster,
SpellInfo const *  spellProto,
uint32  damage,
Unit const *  victim 
)
static
Todo:
: write here full calculation for melee/ranged spells
12282{
12283 // Calculate critical bonus
12284 int32 crit_bonus = damage;
12285 float crit_mod = 0.0f;
12286
12287 switch (spellProto->DmgClass)
12288 {
12289 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12292 crit_bonus += damage;
12293 break;
12294 default:
12295 crit_bonus += damage / 2; // for spells is 50%
12296 break;
12297 }
12298
12299 if (caster)
12300 {
12301 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellProto->GetSchoolMask());
12302
12303 if (victim)
12304 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, victim->GetCreatureTypeMask());
12305
12306 if (crit_bonus != 0 && crit_mod != 0.0f)
12307 AddPct(crit_bonus, crit_mod);
12308
12309 crit_bonus -= damage;
12310
12311 // adds additional damage to critBonus (from talents)
12312 if (Player* modOwner = caster->GetSpellModOwner())
12313 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12314
12315 crit_bonus += damage;
12316 }
12317
12318 return crit_bonus;
12319}

References AddPct(), SpellInfo::DmgClass, GetCreatureTypeMask(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), SpellInfo::Id, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_RANGED, and SPELLMOD_CRIT_DAMAGE_BONUS.

Referenced by CalculateSpellDamageTaken(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellCriticalHealingBonus()

uint32 Unit::SpellCriticalHealingBonus ( Unit const *  caster,
SpellInfo const *  spellProto,
uint32  damage,
Unit const *  victim 
)
static
Todo:
: write here full calculation for melee/ranged spells
12322{
12323 // Calculate critical bonus
12324 int32 crit_bonus;
12325 switch (spellProto->DmgClass)
12326 {
12327 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12330 crit_bonus = damage;
12331 break;
12332 default:
12333 crit_bonus = damage / 2; // for spells is 50%
12334 break;
12335 }
12336
12337 if (caster)
12338 {
12339 if (victim)
12340 {
12341 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
12342 crit_bonus = int32(crit_bonus * caster->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, creatureTypeMask));
12343 }
12344
12345 // adds additional damage to critBonus (from talents)
12346 // xinef: used for death knight death coil
12347 if (Player* modOwner = caster->GetSpellModOwner())
12348 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12349 }
12350
12351 if (crit_bonus > 0)
12352 damage += crit_bonus;
12353
12354 if (caster)
12355 damage = int32(float(damage) * caster->GetTotalAuraMultiplier(SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT));
12356
12357 return damage;
12358}
@ SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT
Definition: SpellAuraDefines.h:113

References SpellInfo::DmgClass, GetCreatureTypeMask(), GetSpellModOwner(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::Id, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_RANGED, and SPELLMOD_CRIT_DAMAGE_BONUS.

Referenced by Spell::DoAllEffectOnTarget(), and AuraEffect::HandlePeriodicHealAurasTick().

◆ SpellDamageBonusDone()

uint32 Unit::SpellDamageBonusDone ( Unit victim,
SpellInfo const *  spellProto,
uint32  pdamage,
DamageEffectType  damagetype,
uint8  effIndex,
float  TotalMod = 0.0f,
uint32  stack = 1 
)
11616{
11617 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11618 return pdamage;
11619
11620 // Some spells don't benefit from done mods
11621 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11622 return pdamage;
11623
11624 // For totems get damage bonus from owner
11625 if (IsCreature())
11626 {
11627 if (IsTotem())
11628 {
11629 if (Unit* owner = GetOwner())
11630 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, effIndex, TotalMod, stack);
11631 }
11632 // Dancing Rune Weapon...
11633 else if (GetEntry() == 27893)
11634 {
11635 if (Unit* owner = GetOwner())
11636 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, TotalMod, stack) / 2;
11637 }
11638 }
11639
11640 // Done total percent damage auras
11641 float ApCoeffMod = 1.0f;
11642 int32 DoneTotal = 0;
11643 float DoneTotalMod = TotalMod ? TotalMod : SpellPctDamageModsDone(victim, spellProto, damagetype);
11644
11645 // Config : RATE_CREATURE_X_SPELLDAMAGE & Do Not Modify Pet/Guardian/Mind Controled Damage
11647 DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->rank);
11648
11649 // Some spells don't benefit from pct done mods
11650 if (!spellProto->HasAttribute(SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS))
11651 {
11652 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11653 // Add flat bonus from spell damage versus
11655 }
11656
11657 // done scripted mod (take it from owner)
11658 Unit* owner = GetOwner() ? GetOwner() : this;
11659 int32 DoneAdvertisedBenefit = 0;
11660 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11661 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11662 {
11663 if (!(*i)->IsAffectedOnSpell(spellProto))
11664 continue;
11665
11666 switch ((*i)->GetMiscValue())
11667 {
11668 case 4418: // Increased Shock Damage
11669 case 4554: // Increased Lightning Damage
11670 case 4555: // Improved Moonfire
11671 case 5142: // Increased Lightning Damage
11672 case 5147: // Improved Consecration / Libram of Resurgence
11673 case 5148: // Idol of the Shooting Star
11674 case 6008: // Increased Lightning Damage
11675 case 8627: // Totem of Hex
11676 {
11677 DoneAdvertisedBenefit += (*i)->GetAmount();
11678 break;
11679 }
11680 }
11681 }
11682
11683 // Custom scripted damage
11684 switch (spellProto->SpellFamilyName)
11685 {
11686 case SPELLFAMILY_DRUID:
11687 {
11688 // Insect Swarm vs Item - Druid T8 Balance Relic
11689 if (spellProto->SpellFamilyFlags[0] & 0x00200000)
11690 {
11691 if (AuraEffect const* relicAurEff = GetAuraEffect(64950, EFFECT_0))
11692 {
11693 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11694 }
11695 }
11696
11697 // Nourish vs Idol of the Flourishing Life
11698 if (spellProto->SpellFamilyFlags[1] & 0x02000000)
11699 {
11700 if (AuraEffect const* relicAurEff = GetAuraEffect(64949, EFFECT_0))
11701 {
11702 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11703 }
11704 }
11705 break;
11706 }
11708 {
11709 // Sigil of the Vengeful Heart
11710 if (spellProto->SpellFamilyFlags[0] & 0x2000)
11711 {
11712 if (AuraEffect* aurEff = GetAuraEffect(64962, EFFECT_1))
11713 {
11714 AddPct(DoneTotal, aurEff->GetAmount());
11715 }
11716 }
11717
11718 // Impurity
11720 {
11721 AddPct(ApCoeffMod, aurEff->GetAmount());
11722 }
11723
11724 // Blood Boil - bonus for diseased targets
11725 if ((spellProto->SpellFamilyFlags[0] & 0x00040000) && victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0, 0x00000002, GetGUID()))
11726 {
11727 DoneTotal += 95;
11728 ApCoeffMod = 1.5835f;
11729 }
11730 break;
11731 }
11732 default:
11733 break;
11734 }
11735
11736 // Done fixed damage bonus auras
11737 DoneAdvertisedBenefit += SpellBaseDamageBonusDone(spellProto->GetSchoolMask());
11738
11739 // Check for table values
11740 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
11741 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
11742 if (bonus)
11743 {
11744 if (damagetype == DOT)
11745 {
11746 coeff = bonus->dot_damage;
11747 if (bonus->ap_dot_bonus > 0)
11748 {
11749 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11751 APbonus += GetTotalAttackPowerValue(attType);
11752 DoneTotal += int32(bonus->ap_dot_bonus * stack * ApCoeffMod * APbonus);
11753 }
11754 }
11755 else
11756 {
11757 coeff = bonus->direct_damage;
11758 if (bonus->ap_bonus > 0)
11759 {
11760 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11762 APbonus += GetTotalAttackPowerValue(attType);
11763 DoneTotal += int32(bonus->ap_bonus * stack * ApCoeffMod * APbonus);
11764 }
11765 }
11766 }
11767
11768 // Default calculation
11769 if (coeff && DoneAdvertisedBenefit)
11770 {
11771 float factorMod = CalculateLevelPenalty(spellProto) * stack;
11772
11773 if (Player* modOwner = GetSpellModOwner())
11774 {
11775 coeff *= 100.0f;
11776 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
11777 coeff /= 100.0f;
11778 }
11779
11780 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
11781 }
11782
11783 float tmpDamage = (float(pdamage) + DoneTotal) * DoneTotalMod;
11784 // apply spellmod to Done damage (flat and pct)
11785 if (Player* modOwner = GetSpellModOwner())
11786 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, tmpDamage);
11787
11788 return uint32(std::max(tmpDamage, 0.0f));
11789}
@ SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS
Definition: SharedDefines.h:633
@ SPELLMOD_DOT
Definition: SpellDefines.h:98
@ SPELLMOD_BONUS_MULTIPLIER
Definition: SpellDefines.h:100
@ SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS
Definition: SpellAuraDefines.h:243
float GetSpellDamageMod(int32 Rank)
Definition: Creature.cpp:1611
float SpellPctDamageModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition: Unit.cpp:11284
float CalculateLevelPenalty(SpellInfo const *spellProto) const
Definition: Unit.cpp:3040
Definition: SpellMgr.h:324
float ap_dot_bonus
Definition: SpellMgr.h:328
float dot_damage
Definition: SpellMgr.h:326
float ap_bonus
Definition: SpellMgr.h:327
float direct_damage
Definition: SpellMgr.h:325

References AddPct(), SpellBonusEntry::ap_bonus, SpellBonusEntry::ap_dot_bonus, BASE_ATTACK, CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, EFFECT_0, EFFECT_1, SpellInfo::Effects, GetAuraEffect(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetOwner(), SpellInfo::GetSchoolMask(), Creature::GetSpellDamageMod(), GetSpellModOwner(), GetTotalAttackPowerValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::Id, IsControlledByPlayer(), Object::IsCreature(), IsGuardian(), IsPet(), SpellInfo::IsRangedWeaponSpell(), IsTotem(), RANGED_ATTACK, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELL_DAMAGE_CLASS_MELEE, SpellBaseDamageBonusDone(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, SPELLMOD_DAMAGE, SPELLMOD_DOT, SpellPctDamageModsDone(), sSpellMgr, and Object::ToCreature().

Referenced by spell_warl_seed_of_corruption_aura::CalculateAmount(), AuraEffect::CalculateAmount(), Spell::EffectHealthLeech(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), spell_warr_bloodthirst::HandleDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ SpellDamageBonusTaken()

uint32 Unit::SpellDamageBonusTaken ( Unit caster,
SpellInfo const *  spellProto,
uint32  pdamage,
DamageEffectType  damagetype,
uint32  stack = 1 
)
11792{
11793 if (!spellProto || damagetype == DIRECT_DAMAGE)
11794 return pdamage;
11795
11796 int32 TakenTotal = 0;
11797 float TakenTotalMod = 1.0f;
11798
11799 // from positive and negative SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
11800 // multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085)
11802 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
11803 if (((*i)->GetMiscValue() & spellProto->GetSchoolMask()))
11804 if (spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11805 AddPct(TakenTotalMod, (*i)->GetAmount());
11806
11807 TakenTotalMod = processDummyAuras(TakenTotalMod);
11808
11809 // From caster spells
11810 if (caster)
11811 {
11813 for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
11814 if ((*i)->GetCasterGUID() == caster->GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
11815 if (spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11816 AddPct(TakenTotalMod, (*i)->GetAmount());
11817 }
11818
11819 if (uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask())
11820 {
11821 int32 modifierMax = 0;
11822 int32 modifierMin = 0;
11824 for (AuraEffectList::const_iterator i = auraEffectList.begin(); i != auraEffectList.end(); ++i)
11825 {
11826 if (!spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11827 continue;
11828
11829 // Only death knight spell with this aura
11830 if ((*i)->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
11831 if (!caster || caster->GetGUID() != (*i)->GetCasterGUID())
11832 continue;
11833
11834 if (mechanicMask & uint32(1 << (*i)->GetMiscValue()))
11835 {
11836 if ((*i)->GetAmount() > 0)
11837 {
11838 if ((*i)->GetAmount() > modifierMax)
11839 modifierMax = (*i)->GetAmount();
11840 }
11841 else if ((*i)->GetAmount() < modifierMin)
11842 modifierMin = (*i)->GetAmount();
11843 }
11844 }
11845
11846 AddPct(TakenTotalMod, modifierMax);
11847 AddPct(TakenTotalMod, modifierMin);
11848 }
11849
11850 int32 TakenAdvertisedBenefit = SpellBaseDamageBonusTaken(spellProto->GetSchoolMask(), damagetype == DOT);
11851
11852 // Check for table values
11853 float coeff = 0;
11854 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
11855 if (bonus)
11856 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
11857
11858 // Default calculation
11859 if (TakenAdvertisedBenefit)
11860 {
11861 if (coeff <= 0.0f)
11862 {
11863 if (caster)
11864 coeff = caster->CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
11865 else
11866 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
11867 }
11868
11869 float factorMod = CalculateLevelPenalty(spellProto) * stack;
11870 TakenTotal += int32(TakenAdvertisedBenefit * coeff * factorMod);
11871 }
11872
11873 // No positive taken bonus, custom attr
11874 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
11875 {
11876 TakenTotal = 0;
11877 TakenTotalMod = 1.0f;
11878 }
11879
11880 // xinef: sanctified wrath talent
11881 if (caster && TakenTotalMod < 1.0f && caster->HasIgnoreTargetResistAura())
11882 {
11883 float ignoreModifier = 1.0f - TakenTotalMod;
11884 bool addModifier = false;
11886 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
11887 if ((*j)->GetMiscValue() & spellProto->SchoolMask)
11888 {
11889 ApplyPct(ignoreModifier, (*j)->GetAmount());
11890 addModifier = true;
11891 }
11892
11893 if (addModifier)
11894 TakenTotalMod += ignoreModifier;
11895 }
11896
11897 float tmpDamage = (float(pdamage) + TakenTotal) * TakenTotalMod;
11898
11899 return uint32(std::max(tmpDamage, 0.0f));
11900}
float CalculateDefaultCoefficient(SpellInfo const *spellInfo, DamageEffectType damagetype) const
Definition: Unit.cpp:17197

References AddPct(), ApplyPct(), CalculateDefaultCoefficient(), CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, DOT, SpellBonusEntry::dot_damage, SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), Object::GetGUID(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasIgnoreTargetResistAura(), SpellInfo::Id, processDummyAuras(), SpellInfo::SchoolMask, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SpellBaseDamageBonusTaken(), SPELLFAMILY_DEATHKNIGHT, sSpellMgr, and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by DealMeleeDamage(), Spell::EffectHealthLeech(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), Aura::HandleAuraSpecificMods(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandleProcTriggerDamageAuraProc(), and spell_black_temple_l5_arcane_charge::PrepareSpellScript().

◆ SpellDoneCritChance()

float Unit::SpellDoneCritChance ( Unit const *  ,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
11995{
11996 // Mobs can't crit with spells.
11997 if (IsCreature() && !GetSpellModOwner())
11998 return -100.0f;
11999
12000 // not critting spell
12001 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
12002 return 0.0f;
12003
12004 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
12005 if (!skipEffectCheck && !spellProto->IsCritCapable())
12006 return 0.0f;
12007
12008 float crit_chance = 0.0f;
12009 switch (spellProto->DmgClass)
12010 {
12012 {
12013 if (schoolMask & SPELL_SCHOOL_MASK_NORMAL)
12014 crit_chance = 0.0f;
12015 // For other schools
12016 else if (IsPlayer())
12017 crit_chance = GetFloatValue(static_cast<uint16>(PLAYER_SPELL_CRIT_PERCENTAGE1) + GetFirstSchoolInMask(schoolMask));
12018 else
12019 {
12020 crit_chance = (float)m_baseSpellCritChance;
12022 }
12023 break;
12024 }
12027 {
12028 if (IsPlayer())
12029 {
12030 switch (attackType)
12031 {
12032 case BASE_ATTACK:
12034 break;
12035 case OFF_ATTACK:
12037 break;
12038 case RANGED_ATTACK:
12040 break;
12041 default:
12042 break;
12043 }
12044 }
12045 else
12046 {
12047 crit_chance = 5.0f;
12050 }
12052 break;
12053 }
12054 // values overridden in spellmgr for lifebloom and earth shield
12056 default:
12057 return 0.0f;
12058 }
12059
12060 // percent done
12061 // only players use intelligence for critical chance computations
12062 if (Player* modOwner = GetSpellModOwner())
12063 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRITICAL_CHANCE, crit_chance);
12064
12065 // xinef: can be negative!
12066 return crit_chance;
12067}
@ SPELL_ATTR2_CANT_CRIT
Definition: SharedDefines.h:485
@ SPELLMOD_CRITICAL_CHANCE
Definition: SpellDefines.h:83
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
Definition: SpellAuraDefines.h:134
@ PLAYER_SPELL_CRIT_PERCENTAGE1
Definition: UpdateFields.h:354

References BASE_ATTACK, SpellInfo::DmgClass, GetFirstSchoolInMask(), Object::GetFloatValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::Id, Object::IsCreature(), SpellInfo::IsCritCapable(), Object::IsPlayer(), m_baseSpellCritChance, OFF_ATTACK, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, PLAYER_SPELL_CRIT_PERCENTAGE1, RANGED_ATTACK, SPELL_ATTR2_CANT_CRIT, SPELL_AURA_MOD_CRIT_PCT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, SPELL_AURA_MOD_WEAPON_CRIT_PERCENT, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_SCHOOL_MASK_NORMAL, and SPELLMOD_CRITICAL_CHANCE.

Referenced by Spell::DoAllEffectOnLaunchTarget().

◆ SpellHealingBonusDone()

uint32 Unit::SpellHealingBonusDone ( Unit victim,
SpellInfo const *  spellProto,
uint32  healamount,
DamageEffectType  damagetype,
uint8  effIndex,
float  TotalMod = 0.0f,
uint32  stack = 1 
)
12453{
12454 // For totems get healing bonus from owner (statue isn't totem in fact)
12455 if (IsCreature() && IsTotem())
12456 if (Unit* owner = GetOwner())
12457 return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, effIndex, TotalMod, stack);
12458
12459 // No bonus healing for potion spells
12460 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12461 return healamount;
12462
12463 float ApCoeffMod = 1.0f;
12464 float DoneTotalMod = TotalMod ? TotalMod : SpellPctHealingModsDone(victim, spellProto, damagetype);
12465 int32 DoneTotal = 0;
12466
12467 // done scripted mod (take it from owner)
12468 Unit* owner = GetOwner() ? GetOwner() : this;
12469 int32 DoneAdvertisedBenefit = 0;
12470 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12471 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12472 {
12473 if (!(*i)->IsAffectedOnSpell(spellProto))
12474 continue;
12475
12476 switch ((*i)->GetMiscValue())
12477 {
12478 case 4415: // Increased Rejuvenation Healing
12479 case 4953:
12480 DoneAdvertisedBenefit += (*i)->GetAmount();
12481 break;
12482 case 3736: // Hateful Totem of the Third Wind / Increased Lesser Healing Wave / LK Arena (4/5/6) Totem of the Third Wind / Savage Totem of the Third Wind
12483 DoneAdvertisedBenefit += (*i)->GetAmount();
12484 break;
12485 }
12486 }
12487
12488 switch (spellProto->SpellFamilyName)
12489 {
12491 {
12492 // Impurity
12494 {
12495 AddPct(ApCoeffMod, aurEff->GetAmount());
12496 }
12497 break;
12498 }
12499 default:
12500 break;
12501 }
12502
12503 // Done fixed damage bonus auras
12504 DoneAdvertisedBenefit += SpellBaseHealingBonusDone(spellProto->GetSchoolMask());
12505 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
12506
12507 // Check for table values
12508 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12509 if (bonus)
12510 {
12511 if (damagetype == DOT)
12512 {
12513 coeff = bonus->dot_damage;
12514 if (bonus->ap_dot_bonus > 0)
12515 DoneTotal += int32(bonus->ap_dot_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12516 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12517 }
12518 else
12519 {
12520 coeff = bonus->direct_damage;
12521 if (bonus->ap_bonus > 0)
12522 DoneTotal += int32(bonus->ap_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12523 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12524 }
12525 }
12526 else
12527 {
12528 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12529 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12530 return healamount;
12531 }
12532
12533 // Default calculation
12534 if (DoneAdvertisedBenefit)
12535 {
12536 float factorMod = CalculateLevelPenalty(spellProto) * stack;
12537 if (Player* modOwner = GetSpellModOwner())
12538 {
12539 coeff *= 100.0f;
12540 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12541 coeff /= 100.0f;
12542 }
12543 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
12544 }
12545
12546 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12547 {
12548 switch (spellProto->Effects[i].ApplyAuraName)
12549 {
12550 // Bonus healing does not apply to these spells
12553 DoneTotal = 0;
12554 break;
12555 }
12556 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12557 DoneTotal = 0;
12558 }
12559
12560 // use float as more appropriate for negative values and percent applying
12561 float heal = float(int32(healamount) + DoneTotal) * DoneTotalMod;
12562 // apply spellmod to Done amount
12563
12564 if (Player* modOwner = GetSpellModOwner())
12565 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, heal);
12566
12567 return uint32(std::max(heal, 0.0f));
12568}
@ SPELL_AURA_PERIODIC_HEALTH_FUNNEL
Definition: SpellAuraDefines.h:125
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition: Unit.cpp:12702
float SpellPctHealingModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition: Unit.cpp:12360

References AddPct(), SpellBonusEntry::ap_bonus, SpellBonusEntry::ap_dot_bonus, BASE_ATTACK, CalculateLevelPenalty(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, SpellInfo::Effects, GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAttackPowerValue(), SpellInfo::Id, Object::IsCreature(), SpellInfo::IsRangedWeaponSpell(), IsTotem(), MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_HEALTH_FUNNEL, SPELL_AURA_PERIODIC_LEECH, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_EFFECT_HEALTH_LEECH, SpellBaseHealingBonusDone(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_POTION, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, SPELLMOD_DAMAGE, SPELLMOD_DOT, SpellPctHealingModsDone(), and sSpellMgr.

Referenced by AuraEffect::CalculateAmount(), Spell::DoAllEffectOnTarget(), Spell::EffectHeal(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), spell_dru_lifebloom::HandleDispel(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellHealingBonusTaken()

uint32 Unit::SpellHealingBonusTaken ( Unit caster,
SpellInfo const *  spellProto,
uint32  healamount,
DamageEffectType  damagetype,
uint32  stack = 1 
)
12571{
12572 float TakenTotalMod = 1.0f;
12573 float minval = 0.0f;
12574
12575 // Healing taken percent
12576 if (!sScriptMgr->OnSpellHealingBonusTakenNegativeModifiers(this, caster, spellProto, minval))
12577 {
12579 }
12580
12581 if (minval)
12582 AddPct(TakenTotalMod, minval);
12583
12585 if (maxval)
12586 AddPct(TakenTotalMod, maxval);
12587
12588 // Tenacity increase healing % taken
12589 if (AuraEffect const* Tenacity = GetAuraEffect(58549, 0))
12590 AddPct(TakenTotalMod, Tenacity->GetAmount());
12591
12592 // Healing Done
12593 int32 TakenTotal = 0;
12594
12595 // Taken fixed damage bonus auras
12596 int32 TakenAdvertisedBenefit = SpellBaseHealingBonusTaken(spellProto->GetSchoolMask());
12597
12598 // Nourish cast, glyph of nourish
12599 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[1] & 0x2000000 && caster)
12600 {
12601 bool any = false;
12602 bool hasglyph = caster->GetAuraEffectDummy(62971);
12604 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
12605 {
12606 if (((*i)->GetCasterGUID() == caster->GetGUID()))
12607 {
12608 SpellInfo const* spell = (*i)->GetSpellInfo();
12609 // Rejuvenation, Regrowth, Lifebloom, or Wild Growth
12610 if (!any && spell->SpellFamilyFlags.HasFlag(0x50, 0x4000010, 0))
12611 {
12612 TakenTotalMod *= 1.2f;
12613 any = true;
12614 }
12615
12616 if (hasglyph)
12617 TakenTotalMod += 0.06f;
12618 }
12619 }
12620 }
12621
12622 if (damagetype == DOT)
12623 {
12624 // Healing over time taken percent
12625 float minval_hot = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12626 if (minval_hot)
12627 AddPct(TakenTotalMod, minval_hot);
12628
12629 float maxval_hot = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12630 if (maxval_hot)
12631 AddPct(TakenTotalMod, maxval_hot);
12632 }
12633
12634 // Check for table values
12635 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12636 float coeff = 0;
12637 float factorMod = 1.0f;
12638 if (bonus)
12639 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
12640 else
12641 {
12642 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12643 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12644 {
12645 healamount = uint32(std::max((float(healamount) * TakenTotalMod), 0.0f));
12646 return healamount;
12647 }
12648 }
12649
12650 // Default calculation
12651 if (TakenAdvertisedBenefit)
12652 {
12653 float TakenCoeff = 0.0f;
12654 if (coeff <= 0)
12655 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack) * 1.88f; // As wowwiki says: C = (Cast Time / 3.5) * 1.88 (for healing spells)
12656
12657 factorMod *= CalculateLevelPenalty(spellProto) * int32(stack);
12658 if (Player* modOwner = GetSpellModOwner())
12659 {
12660 coeff *= 100.0f;
12661 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12662 coeff /= 100.0f;
12663 }
12664
12665 TakenTotal += int32(TakenAdvertisedBenefit * (coeff > 0 ? coeff : TakenCoeff) * factorMod);
12666 }
12667
12668 if (caster)
12669 {
12671 for (AuraEffectList::const_iterator i = mHealingGet.begin(); i != mHealingGet.end(); ++i)
12672 if (caster->GetGUID() == (*i)->GetCasterGUID() && (*i)->IsAffectedOnSpell(spellProto))
12673 AddPct(TakenTotalMod, (*i)->GetAmount());
12674 }
12675
12676 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12677 {
12678 switch (spellProto->Effects[i].ApplyAuraName)
12679 {
12680 // Bonus healing does not apply to these spells
12683 TakenTotal = 0;
12684 break;
12685 }
12686 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12687 TakenTotal = 0;
12688 }
12689
12690 // No positive taken bonus, custom attr
12691 if ((spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS) || spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS)) && TakenTotalMod > 1.0f)
12692 {
12693 TakenTotal = 0;
12694 TakenTotalMod = 1.0f;
12695 }
12696
12697 float heal = float(int32(healamount) + TakenTotal) * TakenTotalMod;
12698
12699 return uint32(std::max(heal, 0.0f));
12700}
@ SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS
Definition: SharedDefines.h:631
@ SPELL_AURA_MOD_HEALING_RECEIVED
Definition: SpellAuraDefines.h:346
@ SPELL_AURA_MOD_HEALING_PCT
Definition: SpellAuraDefines.h:181
@ SPELL_AURA_MOD_HOT_PCT
Definition: SpellAuraDefines.h:322
int32 GetMaxPositiveAuraModifier(AuraType auratype)
Definition: Unit.cpp:5935
int32 GetMaxNegativeAuraModifier(AuraType auratype) const
Definition: Unit.cpp:5949
int32 SpellBaseHealingBonusTaken(SpellSchoolMask schoolMask)
Definition: Unit.cpp:12735

References AddPct(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, GetAuraEffect(), GetAuraEffectDummy(), GetAuraEffectsByType(), Object::GetGUID(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), SpellInfo::GetSchoolMask(), flag96::HasFlag(), SpellInfo::Id, SPELL_AURA_MOD_HEALING_PCT, SPELL_AURA_MOD_HOT_PCT, SPELL_AURA_PERIODIC_HEAL, SPELL_DAMAGE_CLASS_NONE, SpellBaseHealingBonusTaken(), SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, sScriptMgr, and sSpellMgr.

Referenced by spell_dru_lifebloom::AfterRemove(), Spell::DoAllEffectOnTarget(), Spell::EffectHeal(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), spell_pri_renew::HandleApplyEffect(), Aura::HandleAuraSpecificMods(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellHitResult() [1/2]

SpellMissInfo Unit::SpellHitResult ( Unit victim,
Spell const *  spell,
bool  canReflect = false 
)
Todo:
: client not show miss log for this spells - so need find info for this in dbc and use it!
3536{
3537 SpellInfo const* spellInfo = spell->GetSpellInfo();
3538
3539 // Check for immune
3540 if (victim->IsImmunedToSpell(spellInfo, spell))
3541 {
3542 return SPELL_MISS_IMMUNE;
3543 }
3544
3545 // All positive spells can`t miss
3547 if ((spellInfo->IsPositive() || spellInfo->HasEffect(SPELL_EFFECT_DISPEL))
3548 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3549 {
3550 return SPELL_MISS_NONE;
3551 }
3552
3553 // Check for immune
3554 // xinef: check for school immunity only
3555 if (victim->IsImmunedToSchool(spell))
3556 {
3557 return SPELL_MISS_IMMUNE;
3558 }
3559
3560 if (this == victim)
3561 {
3562 return SPELL_MISS_NONE;
3563 }
3564
3565 // Return evade for units in evade mode
3566 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) &&
3568 {
3569 return SPELL_MISS_EVADE;
3570 }
3571
3572 // Try victim reflect spell
3573 if (CanReflect)
3574 {
3575 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3576 Unit::AuraEffectList const& mReflectSpellsSchool = victim->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL);
3577 for (Unit::AuraEffectList::const_iterator i = mReflectSpellsSchool.begin(); i != mReflectSpellsSchool.end(); ++i)
3578 {
3579 if ((*i)->GetMiscValue() & spell->GetSpellSchoolMask())
3580 {
3581 reflectchance += (*i)->GetAmount();
3582 }
3583 }
3584
3585 if (reflectchance > 0 && roll_chance_i(reflectchance))
3586 {
3587 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3588 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3589 return SPELL_MISS_REFLECT;
3590 }
3591 }
3592
3593 switch (spellInfo->DmgClass)
3594 {
3597 return MeleeSpellHitResult(victim, spellInfo);
3599 {
3600 if (spellInfo->SpellFamilyName)
3601 {
3602 return SPELL_MISS_NONE;
3603 }
3604
3605 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3606 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3607 {
3608 if (spellInfo->Effects[i].Effect && spellInfo->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3609 {
3610 if (spellInfo->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3611 {
3612 return SPELL_MISS_NONE;
3613 }
3614 }
3615 }
3616 [[fallthrough]];
3617 }
3619 return MagicSpellHitResult(victim, spellInfo);
3620 }
3621
3622 return SPELL_MISS_NONE;
3623}
@ SPELL_EFFECT_DISPEL
Definition: SharedDefines.h:816
@ SPELL_MISS_IMMUNE
Definition: SharedDefines.h:1526
@ SPELL_MISS_EVADE
Definition: SharedDefines.h:1525
@ SPELL_MISS_REFLECT
Definition: SharedDefines.h:1530
SpellMissInfo MagicSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition: Unit.cpp:3327
SpellMissInfo MeleeSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition: Unit.cpp:3154
uint32 DmgClass
Definition: SpellInfo.h:389

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, GetAuraEffectsByType(), Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_REFLECT_SPELLS, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_EFFECT_DISPEL, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_MISS_EVADE, SPELL_MISS_IMMUNE, SPELL_MISS_NONE, SPELL_MISS_REFLECT, SpellInfo::SpellFamilyName, and Object::ToCreature().

◆ SpellHitResult() [2/2]

SpellMissInfo Unit::SpellHitResult ( Unit victim,
SpellInfo const *  spell,
bool  canReflect = false 
)
Todo:
: client not show miss log for this spells - so need find info for this in dbc and use it!
3471{
3472 // Check for immune
3473 if (victim->IsImmunedToSpell(spell))
3474 return SPELL_MISS_IMMUNE;
3475
3476 // All positive spells can`t miss
3478 if ((spell->IsPositive() || spell->HasEffect(SPELL_EFFECT_DISPEL))
3479 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3480 return SPELL_MISS_NONE;
3481
3482 // Check for immune
3483 // xinef: check for school immunity only
3484 if (victim->IsImmunedToSchool(spell))
3485 return SPELL_MISS_IMMUNE;
3486
3487 if (this == victim)
3488 return SPELL_MISS_NONE;
3489
3490 // Return evade for units in evade mode
3491 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spell->HasAura(SPELL_AURA_CONTROL_VEHICLE)
3492 && !spell->HasAttribute(SPELL_ATTR0_CU_IGNORE_EVADE) && !spell->HasAttribute(SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT))
3493 return SPELL_MISS_EVADE;
3494
3495 // Try victim reflect spell
3496 if (CanReflect)
3497 {
3498 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3499 Unit::AuraEffectList const& mReflectSpellsSchool = victim->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL);
3500 for (Unit::AuraEffectList::const_iterator i = mReflectSpellsSchool.begin(); i != mReflectSpellsSchool.end(); ++i)
3501 if ((*i)->GetMiscValue() & spell->GetSchoolMask())
3502 reflectchance += (*i)->GetAmount();
3503 if (reflectchance > 0 && roll_chance_i(reflectchance))
3504 {
3505 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3506 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3507 return SPELL_MISS_REFLECT;
3508 }
3509 }
3510
3511 switch (spell->DmgClass)
3512 {
3515 return MeleeSpellHitResult(victim, spell);
3517 {
3518 if (spell->SpellFamilyName)
3519 {
3520 return SPELL_MISS_NONE;
3521 }
3522 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3523 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3524 if (spell->Effects[i].Effect && spell->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3525 if (spell->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3526 return SPELL_MISS_NONE;
3527 [[fallthrough]];
3528 }
3530 return MagicSpellHitResult(victim, spell);
3531 }
3532 return SPELL_MISS_NONE;
3533}

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, GetAuraEffectsByType(), SpellInfo::GetSchoolMask(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_REFLECT_SPELLS, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_EFFECT_DISPEL, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_MISS_EVADE, SPELL_MISS_IMMUNE, SPELL_MISS_NONE, SPELL_MISS_REFLECT, SpellInfo::SpellFamilyName, and Object::ToCreature().

Referenced by Spell::AddUnitTarget(), DealMeleeDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SpellPctDamageModsDone()

float Unit::SpellPctDamageModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
11285{
11286 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11287 return 1.0f;
11288
11289 // Some spells don't benefit from done mods
11290 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11291 return 1.0f;
11292
11293 // For totems get damage bonus from owner
11294 if (IsCreature())
11295 {
11296 if (IsTotem())
11297 {
11298 if (Unit* owner = GetOwner())
11299 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11300 }
11301 // Dancing Rune Weapon...
11302 else if (GetEntry() == 27893)
11303 {
11304 if (Unit* owner = GetOwner())
11305 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11306 }
11307 }
11308
11309 // Done total percent damage auras
11310 float DoneTotalMod = 1.0f;
11311
11313 for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
11314 {
11315 // prevent apply mods from weapon specific case to non weapon specific spells (Example: thunder clap and two-handed weapon specialization)
11316 if (spellProto->EquippedItemClass == -1 && (*i)->GetSpellInfo()->EquippedItemClass != -1 &&
11317 !(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && (*i)->GetMiscValue() == SPELL_SCHOOL_MASK_NORMAL)
11318 {
11319 continue;
11320 }
11321
11322 if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11323 continue;
11324
11325 if (!sScriptMgr->IsNeedModSpellDamagePercent(this, *i, DoneTotalMod, spellProto))
11326 continue;
11327
11328 if ((*i)->GetMiscValue() & spellProto->GetSchoolMask())
11329 {
11330 if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
11331 AddPct(DoneTotalMod, (*i)->GetAmount());
11332 else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
11333 AddPct(DoneTotalMod, (*i)->GetAmount());
11334 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
11335 AddPct(DoneTotalMod, (*i)->GetAmount());
11336 }
11337 }
11338
11339 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11341 for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
11342 if ((creatureTypeMask & uint32((*i)->GetMiscValue())) && spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11343 AddPct(DoneTotalMod, (*i)->GetAmount());
11344
11345 // bonus against aurastate
11347 for (AuraEffectList::const_iterator i = mDamageDoneVersusAurastate.begin(); i != mDamageDoneVersusAurastate.end(); ++i)
11348 if (victim->HasAuraState(AuraStateType((*i)->GetMiscValue())) && spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11349 AddPct(DoneTotalMod, (*i)->GetAmount());
11350
11351 // done scripted mod (take it from owner)
11352 Unit* owner = GetOwner() ? GetOwner() : this;
11353 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11354 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11355 {
11356 // Xinef: self cast is ommited (because of Rage of Rivendare)
11357 if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11358 continue;
11359
11360 // xinef: Molten Fury should work on all spells
11361 switch ((*i)->GetMiscValue())
11362 {
11363 case 4920: // Molten Fury
11364 case 4919:
11365 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11366 AddPct(DoneTotalMod, (*i)->GetAmount());
11367 break;
11368 }
11369
11370 if (!(*i)->IsAffectedOnSpell(spellProto))
11371 continue;
11372
11373 switch ((*i)->GetMiscValue())
11374 {
11375 case 6917: // Death's Embrace
11376 case 6926:
11377 case 6928:
11378 {
11379 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11380 AddPct(DoneTotalMod, (*i)->GetAmount());
11381 break;
11382 }
11383 // Soul Siphon
11384 case 4992:
11385 case 4993:
11386 {
11387 // effect 1 m_amount
11388 int32 maxPercent = (*i)->GetAmount();
11389 // effect 0 m_amount
11390 int32 stepPercent = CalculateSpellDamage(this, (*i)->GetSpellInfo(), 0);
11391 // count affliction effects and calc additional damage in percentage
11392 int32 modPercent = 0;
11393 AuraApplicationMap const& victimAuras = victim->GetAppliedAuras();
11394 for (AuraApplicationMap::const_iterator itr = victimAuras.begin(); itr != victimAuras.end(); ++itr)
11395 {
11396 Aura const* aura = itr->second->GetBase();
11397 SpellInfo const* m_spell = aura->GetSpellInfo();
11398 if (m_spell->SpellFamilyName != SPELLFAMILY_WARLOCK || !(m_spell->SpellFamilyFlags[1] & 0x0004071B || m_spell->SpellFamilyFlags[0] & 0x8044C402))
11399 continue;
11400 modPercent += stepPercent * aura->GetStackAmount();
11401 if (modPercent >= maxPercent)
11402 {
11403 modPercent = maxPercent;
11404 break;
11405 }
11406 }
11407 AddPct(DoneTotalMod, modPercent);
11408 break;
11409 }
11410 case 6916: // Death's Embrace
11411 case 6925:
11412 case 6927:
11413 if (HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, spellProto, this))
11414 AddPct(DoneTotalMod, (*i)->GetAmount());
11415 break;
11416 case 5481: // Starfire Bonus
11417 {
11418 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x200002, 0, 0))
11419 AddPct(DoneTotalMod, (*i)->GetAmount());
11420 break;
11421 }
11422 // Tundra Stalker
11423 // Merciless Combat
11424 case 7277:
11425 {
11426 // Merciless Combat
11427 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
11428 {
11429 if ((spellProto && spellProto->SpellFamilyFlags[0] & 0x2) || spellProto->SpellFamilyFlags[1] & 0x2 )
11430 if (!victim->HealthAbovePct(35))
11431 AddPct(DoneTotalMod, (*i)->GetAmount());
11432 }
11433 // Tundra Stalker
11434 else
11435 {
11436 // Frost Fever (target debuff)
11437 if (victim->HasAura(55095))
11438 AddPct(DoneTotalMod, (*i)->GetAmount());
11439 break;
11440 }
11441 break;
11442 }
11443 // Rage of Rivendare
11444 case 7293:
11445 {
11447 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
11448 break;
11449 }
11450 // Twisted Faith
11451 case 7377:
11452 {
11454 AddPct(DoneTotalMod, (*i)->GetAmount());
11455 break;
11456 }
11457 // Marked for Death
11458 case 7598:
11459 case 7599:
11460 case 7600:
11461 case 7601:
11462 case 7602:
11463 {
11464 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
11465 AddPct(DoneTotalMod, (*i)->GetAmount());
11466 break;
11467 }
11468 // Dirty Deeds
11469 case 6427:
11470 case 6428:
11471 case 6579:
11472 case 6580:
11473 {
11474 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11475 {
11476 // effect 0 has expected value but in negative state
11477 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
11478 AddPct(DoneTotalMod, bonus);
11479 }
11480 break;
11481 }
11482 }
11483 }
11484
11485 // Custom scripted damage
11486 switch (spellProto->SpellFamilyName)
11487 {
11488 case SPELLFAMILY_MAGE:
11489 // Ice Lance
11490 if (spellProto->SpellIconID == 186)
11491 {
11492 if (victim->HasAuraState(AURA_STATE_FROZEN, spellProto, this))
11493 {
11494 // Glyph of Ice Lance
11495 if (owner->HasAura(56377) && victim->GetLevel() > owner->GetLevel())
11496 DoneTotalMod *= 4.0f;
11497 else
11498 DoneTotalMod *= 3.0f;
11499 }
11500 }
11501
11502 // Torment the weak
11503 if (spellProto->SpellFamilyFlags[0] & 0x20600021 || spellProto->SpellFamilyFlags[1] & 0x9000)
11504 if (victim->HasAuraWithMechanic((1 << MECHANIC_SNARE) | (1 << MECHANIC_SLOW_ATTACK)))
11506 AddPct(DoneTotalMod, aurEff->GetAmount());
11507 break;
11508 case SPELLFAMILY_PRIEST:
11509 // Mind Flay
11510 if (spellProto->SpellFamilyFlags[0] & 0x800000)
11511 {
11512 // Glyph of Shadow Word: Pain
11513 if (AuraEffect* aurEff = GetAuraEffect(55687, 0))
11514 // Increase Mind Flay damage if Shadow Word: Pain present on target
11516 AddPct(DoneTotalMod, aurEff->GetAmount());
11517
11518 // Twisted Faith - Mind Flay part
11520 // Increase Mind Flay damage if Shadow Word: Pain present on target
11522 AddPct(DoneTotalMod, aurEff->GetAmount());
11523 }
11524 // Smite
11525 else if (spellProto->SpellFamilyFlags[0] & 0x80)
11526 {
11527 // Glyph of Smite
11528 if (AuraEffect* aurEff = GetAuraEffect(55692, 0))
11529 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x100000, 0, 0, GetGUID()))
11530 AddPct(DoneTotalMod, aurEff->GetAmount());
11531 }
11532 // Shadow Word: Death
11533 else if (spellProto->SpellFamilyFlags[1] & 0x2)
11534 {
11535 // Glyph of Shadow Word: Death
11536 if (AuraEffect* aurEff = GetAuraEffect(55682, 1))
11538 AddPct(DoneTotalMod, aurEff->GetAmount());
11539 }
11540
11541 break;
11543 // Judgement of Vengeance/Judgement of Corruption
11544 if ((spellProto->SpellFamilyFlags[1] & 0x400000) && spellProto->SpellIconID == 2292)
11545 {
11546 // Get stack of Holy Vengeance/Blood Corruption on the target added by caster
11547 uint32 stacks = 0;
11549 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
11550 if (((*itr)->GetId() == 31803 || (*itr)->GetId() == 53742) && (*itr)->GetCasterGUID() == GetGUID())
11551 {
11552 stacks = (*itr)->GetBase()->GetStackAmount();
11553 break;
11554 }
11555 // + 10% for each application of Holy Vengeance/Blood Corruption on the target
11556 if (stacks)
11557 AddPct(DoneTotalMod, 10 * stacks);
11558 }
11559 break;
11560 case SPELLFAMILY_DRUID:
11561 // Thorns
11562 if (spellProto->SpellFamilyFlags[0] & 0x100)
11563 {
11564 // Brambles
11565 if (AuraEffect* aurEff = GetAuraEffectOfRankedSpell(16836, 0))
11566 AddPct(DoneTotalMod, aurEff->GetAmount());
11567 }
11568 break;
11570 // Fire and Brimstone
11571 if (spellProto->SpellFamilyFlags[1] & 0x00020040)
11573 {
11575 for (AuraEffectList::const_iterator i = mDumyAuras.begin(); i != mDumyAuras.end(); ++i)
11576 if ((*i)->GetSpellInfo()->SpellIconID == 3173)
11577 {
11578 AddPct(DoneTotalMod, (*i)->GetAmount());
11579 break;
11580 }
11581 }
11582 // Drain Soul - increased damage for targets under 25 % HP
11583 if (spellProto->SpellFamilyFlags[0] & 0x00004000)
11584 if (!victim->HealthAbovePct(25))
11585 DoneTotalMod *= 4;
11586 // Shadow Bite (15% increase from each dot)
11587 if (spellProto->SpellFamilyFlags[1] & 0x00400000 && IsPet())
11588 if (uint8 count = victim->GetDoTsByCaster(GetOwnerGUID()))
11589 AddPct(DoneTotalMod, 15 * count);
11590 break;
11591 case SPELLFAMILY_HUNTER:
11592 // Steady Shot
11593 if (spellProto->SpellFamilyFlags[1] & 0x1)
11594 if (AuraEffect* aurEff = GetAuraEffect(56826, 0)) // Glyph of Steady Shot
11595 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_HUNTER, 0x00004000, 0, 0, GetGUID()))
11596 AddPct(DoneTotalMod, aurEff->GetAmount());
11597 break;
11599 // Improved Icy Touch
11600 if (spellProto->SpellFamilyFlags[0] & 0x2)
11602 AddPct(DoneTotalMod, aurEff->GetAmount());
11603
11604 // Glacier Rot
11605 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
11607 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
11608 AddPct(DoneTotalMod, aurEff->GetAmount());
11609 break;
11610 }
11611
11612 return DoneTotalMod;
11613}
@ MECHANIC_SLOW_ATTACK
Definition: SharedDefines.h:1333
@ AURA_STATE_HEALTHLESS_20_PERCENT
Definition: SharedDefines.h:1293
@ AURA_STATE_CONFLAGRATE
Definition: SharedDefines.h:1306
uint32 GetDiseasesByCaster(ObjectGuid casterGUID, uint8 mode=0)
Definition: Unit.cpp:5821
bool HasAuraWithMechanic(uint32 mechanicMask) const
Definition: Unit.cpp:5792
AuraEffect * GetAuraEffectOfRankedSpell(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition: Unit.cpp:5508
uint32 GetDoTsByCaster(ObjectGuid casterGUID) const
Definition: Unit.cpp:5867

References AddPct(), AURA_STATE_CONFLAGRATE, AURA_STATE_FROZEN, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, CalculateSpellDamage(), DIRECT_DAMAGE, DOT, EFFECT_0, SpellInfo::EquippedItemClass, GetAppliedAuras(), GetAuraEffect(), GetAuraEffectOfRankedSpell(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDiseasesByCaster(), GetDoTsByCaster(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetLevel(), GetOwner(), GetOwnerGUID(), SpellInfo::GetSchoolMask(), Aura::GetSpellInfo(), Aura::GetStackAmount(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraWithMechanic(), HealthAbovePct(), Object::IsCreature(), IsPet(), IsTotem(), MECHANIC_SLOW_ATTACK, MECHANIC_SNARE, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM, SPELL_AURA_DUMMY, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_STALKED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PRIEST, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, sScriptMgr, Object::ToPlayer(), and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by AuraEffect::CalculatePeriodicData(), and SpellDamageBonusDone().

◆ SpellPctHealingModsDone()

float Unit::SpellPctHealingModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
12361{
12362 // For totems get healing bonus from owner (statue isn't totem in fact)
12363 if (IsCreature() && IsTotem())
12364 if (Unit* owner = GetOwner())
12365 return owner->SpellPctHealingModsDone(victim, spellProto, damagetype);
12366
12367 // Some spells don't benefit from done mods
12368 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
12369 return 1.0f;
12370
12371 // xinef: Some spells don't benefit from done mods
12372 if (spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS))
12373 return 1.0f;
12374
12375 // No bonus healing for potion spells
12376 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12377 return 1.0f;
12378
12379 float DoneTotalMod = 1.0f;
12380
12381 // Healing done percent
12383 for (auto const& auraEff : mHealingDonePct)
12384 {
12385 if (!sScriptMgr->IsNeedModHealPercent(this, auraEff, DoneTotalMod, spellProto))
12386 continue;
12387
12388 AddPct(DoneTotalMod, auraEff->GetAmount());
12389 }
12390
12391 // done scripted mod (take it from owner)
12392 Unit* owner = GetOwner() ? GetOwner() : this;
12393 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12394 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12395 {
12396 if (!(*i)->IsAffectedOnSpell(spellProto))
12397 continue;
12398
12399 switch ((*i)->GetMiscValue())
12400 {
12401 case 21: // Test of Faith
12402 case 6935:
12403 case 6918:
12404 if (victim->HealthBelowPct(50))
12405 AddPct(DoneTotalMod, (*i)->GetAmount());
12406 break;
12407 case 7798: // Glyph of Regrowth
12408 {
12410 AddPct(DoneTotalMod, (*i)->GetAmount());
12411 break;
12412 }
12413
12414 case 7871: // Glyph of Lesser Healing Wave
12415 {
12416 // xinef: affected by any earth shield
12417 if (victim->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 0, 0x00000400, 0))
12418 AddPct(DoneTotalMod, (*i)->GetAmount());
12419 break;
12420 }
12421 default:
12422 break;
12423 }
12424 }
12425
12426 switch (spellProto->SpellFamilyName)
12427 {
12429 // Talents and glyphs for healing stream totem
12430 if (spellProto->Id == 52042)
12431 {
12432 // Glyph of Healing Stream Totem
12433 if (AuraEffect* dummy = owner->GetAuraEffect(55456, EFFECT_0))
12434 AddPct(DoneTotalMod, dummy->GetAmount());
12435
12436 // Healing Stream totem - Restorative Totems
12437 if (AuraEffect* aurEff = GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 338, 1))
12438 AddPct(DoneTotalMod, aurEff->GetAmount());
12439 }
12440 break;
12441 case SPELLFAMILY_PRIEST:
12442 // T9 HEALING 4P, empowered renew instant heal
12443 if (spellProto->Id == 63544)
12444 if (AuraEffect* aurEff = GetAuraEffect(67202, EFFECT_0))
12445 AddPct(DoneTotalMod, aurEff->GetAmount());
12446 break;
12447 }
12448
12449 return DoneTotalMod;
12450}
@ SPELL_AURA_MOD_HEALING_DONE_PERCENT
Definition: SpellAuraDefines.h:199

References AddPct(), EFFECT_0, GetAuraEffect(), GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), SpellInfo::HasAttribute(), HealthBelowPct(), SpellInfo::Id, Object::IsCreature(), IsTotem(), SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS, SPELL_AURA_DUMMY, SPELL_AURA_MOD_HEALING_DONE_PERCENT, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_POTION, SPELLFAMILY_PRIEST, SPELLFAMILY_SHAMAN, SpellInfo::SpellFamilyName, and sScriptMgr.

Referenced by AuraEffect::CalculatePeriodicData(), and SpellHealingBonusDone().

◆ SpellTakenCritChance()

float Unit::SpellTakenCritChance ( Unit const *  caster,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
float  doneChance,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
12070{
12071 // not critting spell
12072 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
12073 return 0.0f;
12074
12075 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
12076 if (!skipEffectCheck && !spellProto->IsCritCapable())
12077 return 0.0f;
12078
12079 float crit_chance = doneChance;
12080 switch (spellProto->DmgClass)
12081 {
12083 {
12084 if (!spellProto->IsPositive())
12085 {
12086 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
12087 // xinef: apply max and min only
12089 {
12092 }
12093
12094 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_SPELL);
12095 }
12096 // scripted (increase crit chance ... against ... target by x%
12097 if (caster)
12098 {
12099 AuraEffectList const& mOverrideClassScript = caster->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12100 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12101 {
12102 if (!((*i)->IsAffectedOnSpell(spellProto)))
12103 continue;
12104 int32 modChance = 0;
12105 switch ((*i)->GetMiscValue())
12106 {
12107 // Shatter
12108 case 911:
12109 modChance += 16;
12110 [[fallthrough]];
12111 case 910:
12112 modChance += 17;
12113 [[fallthrough]];
12114 case 849:
12115 modChance += 17;
12116 if (!HasAuraState(AURA_STATE_FROZEN, spellProto, caster))
12117 break;
12118 crit_chance += modChance;
12119 break;
12120 case 7917: // Glyph of Shadowburn
12121 if (HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, caster))
12122 crit_chance += (*i)->GetAmount();
12123 break;
12124 case 7997: // Renewed Hope
12125 case 7998:
12126 if (HasAura(6788))
12127 crit_chance += (*i)->GetAmount();
12128 break;
12129 default:
12130 break;
12131 }
12132 }
12133 // Custom crit by class
12134 switch (spellProto->SpellFamilyName)
12135 {
12136 case SPELLFAMILY_MAGE:
12137 // Glyph of Fire Blast
12138 if (spellProto->SpellFamilyFlags[0] == 0x2 && spellProto->SpellIconID == 12)
12140 if (AuraEffect const* aurEff = caster->GetAuraEffect(56369, EFFECT_0))
12141 crit_chance += aurEff->GetAmount();
12142 break;
12143 case SPELLFAMILY_DRUID:
12144 // Improved Faerie Fire
12146 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 109, 0))
12147 crit_chance += aurEff->GetAmount();
12148
12149 // cumulative effect - don't break
12150
12151 // Starfire
12152 if (spellProto->SpellFamilyFlags[0] & 0x4 && spellProto->SpellIconID == 1485)
12153 {
12154 // Improved Insect Swarm
12155 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 1771, 0))
12157 crit_chance += aurEff->GetAmount();
12158 break;
12159 }
12160 break;
12161 case SPELLFAMILY_ROGUE:
12162 // Shiv-applied poisons can't crit
12163 if (caster->FindCurrentSpellBySpellId(5938))
12164 crit_chance = 0.0f;
12165 break;
12167 // Flash of light
12168 if (spellProto->SpellFamilyFlags[0] & 0x40000000)
12169 {
12170 // Sacred Shield
12171 if (AuraEffect const* aura = GetAuraEffect(58597, 1, GetGUID()))
12172 crit_chance += aura->GetAmount();
12173 break;
12174 }
12175 // Exorcism
12176 else if (spellProto->GetCategory() == 19)
12177 {
12179 return 100.0f;
12180 break;
12181 }
12182 break;
12183 case SPELLFAMILY_SHAMAN:
12184 // Lava Burst
12185 if (spellProto->SpellFamilyFlags[1] & 0x00001000)
12186 {
12187 if (GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0, 0, caster->GetGUID()))
12189 return 100.0f;
12190 break;
12191 }
12192 break;
12193 }
12194 }
12195 break;
12196 }
12198 // Custom crit by class
12199 if (caster)
12200 {
12201 switch (spellProto->SpellFamilyName)
12202 {
12203 case SPELLFAMILY_DRUID:
12204 // Rend and Tear - bonus crit chance for Ferocious Bite on bleeding targets
12205 if (spellProto->SpellFamilyFlags[0] & 0x00800000 && spellProto->SpellIconID == 1680 && HasAuraState(AURA_STATE_BLEEDING))
12206 {
12207 if (AuraEffect const* rendAndTear = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 2859, 1))
12208 crit_chance += rendAndTear->GetAmount();
12209 break;
12210 }
12211 break;
12213 // Victory Rush
12214 if (spellProto->SpellFamilyFlags[1] & 0x100)
12215 {
12216 // Glyph of Victory Rush
12217 if (AuraEffect const* aurEff = caster->GetAuraEffect(58382, 0))
12218 crit_chance += aurEff->GetAmount();
12219 break;
12220 }
12221 break;
12222 }
12223 }
12224
12225 // 100% critical chance against sitting target
12227 {
12228 return 100.0f;
12229 }
12230 [[fallthrough]];
12232 {
12233 // flat aura mods
12234 if (attackType == RANGED_ATTACK)
12236 else
12238
12239 // reduce crit chance from Rating for players
12240 if (attackType != RANGED_ATTACK)
12241 {
12242 // xinef: little hack, crit chance dont require caster to calculate, pass victim
12243 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_MELEE);
12244 }
12245 else
12246 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_RANGED);
12247
12248 // Apply crit chance from defence skill
12249 if (caster)
12250 crit_chance += (int32(caster->GetMaxSkillValueForLevel(this)) - int32(GetDefenseSkillValue(caster))) * 0.04f;
12251
12252 break;
12253 }
12254 // values overridden in spellmgr for lifebloom and earth shield
12256 default:
12257 return 0.0f;
12258 }
12259
12260 if (caster)
12261 {
12263 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
12264 {
12265 if (caster->GetGUID() != (*i)->GetCasterGUID())
12266 continue;
12267
12268 crit_chance += (*i)->GetAmount();
12269 }
12270 }
12271
12272 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
12273 // xinef: should be calculated at the end
12274 if (!spellProto->IsPositive())
12276
12277 // xinef: can be negative!
12278 return crit_chance;
12279}
uint32 const CREATURE_TYPEMASK_DEMON_OR_UNDEAD
Definition: SharedDefines.h:2643
@ MECHANIC_KNOCKOUT
Definition: SharedDefines.h:1339
@ AURA_STATE_BLEEDING
Definition: SharedDefines.h:1310
@ AURA_STATE_FAERIE_FIRE
Definition: SharedDefines.h:1304
int32 GetMaxPositiveAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
Definition: Unit.cpp:5986
bool HasAttackerSpellCritChanceAura() const
Definition: Unit.h:1693
int32 GetMaxNegativeAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition: Unit.cpp:6000

References ApplyResilience(), AURA_STATE_BLEEDING, AURA_STATE_FAERIE_FIRE, AURA_STATE_FROZEN, AURA_STATE_HEALTHLESS_35_PERCENT, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CREATURE_TYPEMASK_DEMON_OR_UNDEAD, SpellInfo::DmgClass, EFFECT_0, FindCurrentSpellBySpellId(), GetAuraEffect(), GetAuraEffectsByType(), SpellInfo::GetCategory(), GetCreatureTypeMask(), GetDefenseSkillValue(), GetDummyAuraEffect(), Object::GetGUID(), GetMaxNegativeAuraModifierByMiscMask(), GetMaxPositiveAuraModifierByMiscMask(), GetMaxSkillValueForLevel(), getStandState(), GetTotalAuraModifier(), HasAttackerSpellCritChanceAura(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraWithMechanic(), SpellInfo::IsCritCapable(), Object::IsPlayer(), SpellInfo::IsPositive(), IsSitState(), MECHANIC_KNOCKOUT, MECHANIC_STUN, RANGED_ATTACK, SPELL_ATTR2_CANT_CRIT, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELLFAMILY_DRUID, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, and UNIT_STAND_STATE_SLEEP.

Referenced by AuraEffect::CalcPeriodicCritChance(), and Spell::DoAllEffectOnLaunchTarget().

◆ StartReactiveTimer()

void Unit::StartReactiveTimer ( ReactiveType  reactive)
inline
#define REACTIVE_TIMER_START
Definition: Unit.h:584

References m_reactiveTimer, and REACTIVE_TIMER_START.

Referenced by ProcDamageAndSpellFor().

◆ StopAttackFaction()

void Unit::StopAttackFaction ( uint32  faction_id)
20171{
20172 if (Unit* victim = GetVictim())
20173 {
20174 if (victim->GetFactionTemplateEntry()->faction == faction_id)
20175 {
20176 AttackStop();
20177 if (IsNonMeleeSpellCast(false))
20179
20180 // melee and ranged forced attack cancel
20181 if (IsPlayer())
20183 }
20184 }
20185
20186 AttackerSet const& attackers = getAttackers();
20187 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
20188 {
20189 if ((*itr)->GetFactionTemplateEntry()->faction == faction_id)
20190 {
20191 (*itr)->AttackStop();
20192 itr = attackers.begin();
20193 }
20194 else
20195 ++itr;
20196 }
20197
20199
20200 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20201 (*itr)->StopAttackFaction(faction_id);
20202}
void deleteReferencesForFaction(uint32 faction)
Definition: HostileRefMgr.cpp:162

References AttackStop(), HostileRefMgr::deleteReferencesForFaction(), getAttackers(), getHostileRefMgr(), GetVictim(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), Object::IsPlayer(), m_Controlled, Player::SendAttackSwingCancelAttack(), and Object::ToPlayer().

Referenced by AuraEffect::HandleForceReaction().

◆ StopAttackingInvalidTarget()

void Unit::StopAttackingInvalidTarget ( )
20205{
20206 AttackerSet const& attackers = getAttackers();
20207 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
20208 {
20209 Unit* attacker = (*itr);
20210 if (!attacker->IsValidAttackTarget(this))
20211 {
20212 attacker->AttackStop();
20213 if (attacker->IsPlayer())
20214 {
20216 }
20217
20218 for (Unit* controled : attacker->m_Controlled)
20219 {
20220 if (controled->GetVictim() == this && !controled->IsValidAttackTarget(this))
20221 {
20222 controled->AttackStop();
20223 }
20224 }
20225
20226 itr = attackers.begin();
20227 }
20228 else
20229 {
20230 ++itr;
20231 }
20232 }
20233}

References AttackStop(), getAttackers(), GetVictim(), Object::IsPlayer(), IsValidAttackTarget(), m_Controlled, Player::SendAttackSwingCancelAttack(), and Object::ToPlayer().

Referenced by RemoveCharmedBy(), and SetCharmedBy().

◆ StopMoving()

void Unit::StopMoving ( )
16652{
16654
16655 // not need send any packets if not in world or not moving
16656 if (!IsInWorld())
16657 return;
16658
16659 if (movespline->Finalized())
16660 return;
16661
16662 // Update position now since Stop does not start a new movement that can be updated later
16663 if (movespline->HasStarted())
16665
16666 Movement::MoveSplineInit init(this);
16667 init.Stop();
16668}
void UpdateSplinePosition()
Definition: Unit.cpp:607
bool HasStarted() const
Definition: MoveSpline.h:129

References ClearUnitState(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::HasStarted(), Object::IsInWorld(), movespline, Movement::MoveSplineInit::Stop(), UNIT_STATE_MOVING, and UpdateSplinePosition().

Referenced by npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_alar::ConstructWaypointsAndMove(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), ScriptedAI::DoCastSpell(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ChaseMovementGenerator< T >::DoInitialize(), WaypointMovementGenerator< Creature >::DoUpdate(), RandomMovementGenerator< T >::DoUpdate(), ChaseMovementGenerator< T >::DoUpdate(), FollowMovementGenerator< T >::DoUpdate(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), WorldSession::HandlePetActionHelper(), RotateMovementGenerator::Initialize(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_kologarn::boss_kologarnAI::JustDied(), boss_swamplord_muselek::JustEngagedWith(), boss_janalai::JustEngagedWith(), Player::LeaveBattleground(), SmartAI::MoveAway(), boss_felmyst::MovementInform(), boss_headless_horseman::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), PauseMovement(), SmartAI::PausePath(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), RemoveCharmedBy(), Creature::RemoveCorpse(), boss_felblood_kaelthas::Reset(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::Reset(), npc_xt002_boombot::npc_xt002_boombotAI::Reset(), boss_leotheras_the_blind::Reset(), IdleMovementGenerator::Reset(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SetCharmedBy(), SmartAI::SetCombatMove(), SetConfused(), boss_victor_nefarius::boss_victor_nefariusAI::SetData(), setDeathState(), SetFeared(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), SetRooted(), npc_magister_aledis::sGossipSelect(), npc_harrison_jones::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_heigan::boss_heiganAI::StartFightPhase(), SmartAI::StopFollow(), SmartAI::StopPath(), CreatureAI::TriggerAlert(), Pet::Update(), TimedFleeingMovementGenerator::Update(), boss_onyxia::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), and PetAI::UpdateAI().

◆ StopMovingOnCurrentPos()

void Unit::StopMovingOnCurrentPos ( )
16691{
16693
16694 // not need send any packets if not in world
16695 if (!IsInWorld())
16696 return;
16697
16698 DisableSpline(); // pussywizard: required so Launch() won't recalculate position from previous spline
16699 Movement::MoveSplineInit init(this);
16700 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
16701 init.SetFacing(GetOrientation());
16702 init.Launch();
16703}

References ClearUnitState(), DisableSpline(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::IsInWorld(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), Movement::MoveSplineInit::SetFacing(), and UNIT_STATE_MOVING.

Referenced by npc_mograine::npc_mograineAI::AshbringerEvent(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_maiev_illidan::DoAction(), boss_alar::DoDiveBomb(), UtherBatteredHiltEvent::Execute(), WorldSession::HandlePetActionHelper(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::HandleSpeedChangeIfNeeded(), boss_flame_leviathan::boss_flame_leviathanAI::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_cyanigosa::boss_cyanigosaAI::JustDied(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_icehowl::boss_icehowlAI::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_ulduar::instance_ulduar_InstanceMapScript::OnCreatureCreate(), boss_janalai::Reset(), boss_skadi::boss_skadiAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), SetRooted(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), Creature::Update(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), and npc_vortex_ride::npc_vortex_rideAI::UpdateAI().

◆ Talk() [1/2]

void Unit::Talk ( std::string_view  text,
ChatMsg  msgType,
Language  language,
float  textRange,
WorldObject const *  target 
)
virtual
21133{
21134 Acore::CustomChatTextBuilder builder(this, msgType, text, language, target);
21137 Cell::VisitWorldObjects(this, worker, textRange);
21138}
static void VisitWorldObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition: CellImpl.h:192
Definition: GridNotifiers.h:592
Definition: GridNotifiers.h:1707
Definition: ChatTextBuilder.h:49

References Cell::VisitWorldObjects().

Referenced by spell_inoculate_nestlewood_owlkin::HandleEffectRemove(), and spell_the_flag_of_ownership::HandleScript().

◆ Talk() [2/2]

void Unit::Talk ( uint32  textId,
ChatMsg  msgType,
float  textRange,
WorldObject const *  target 
)
virtual
21185{
21186 if (!sObjectMgr->GetBroadcastText(textId))
21187 {
21188 LOG_ERROR("entities.unit", "Unit::Talk: `broadcast_text` (ID: {}) was not found", textId);
21189 return;
21190 }
21191
21192 Acore::BroadcastTextBuilder builder(this, msgType, textId, getGender(), target);
21195 Cell::VisitWorldObjects(this, worker, textRange);
21196}
Definition: ChatTextBuilder.h:31

References getGender(), LOG_ERROR, sObjectMgr, and Cell::VisitWorldObjects().

◆ TauntApply()

void Unit::TauntApply ( Unit victim)
14665{
14666 ASSERT(IsCreature());
14667
14668 if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster()))
14669 return;
14670
14671 if (!CanHaveThreatList())
14672 return;
14673
14674 Creature* creature = ToCreature();
14675
14676 if (creature->HasReactState(REACT_PASSIVE))
14677 return;
14678
14679 Unit* target = GetVictim();
14680 if (target && target == taunter)
14681 return;
14682
14683 SetInFront(taunter);
14684 SetGuidValue(UNIT_FIELD_TARGET, taunter->GetGUID());
14685
14686 if (creature->IsAIEnabled)
14687 creature->AI()->AttackStart(taunter);
14688
14689 //m_ThreatMgr.tauntApply(taunter);
14690}
void SetInFront(WorldObject const *target)
Definition: Unit.cpp:20522

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), Object::GetGUID(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), Player::IsGameMaster(), Object::IsPlayer(), REACT_PASSIVE, Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and boss_razorgore::boss_razorgoreAI::OnCharmed().

◆ TauntFadeOut()

void Unit::TauntFadeOut ( Unit taunter)
14695{
14696 ASSERT(IsCreature());
14697
14698 if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster()))
14699 return;
14700
14701 if (!CanHaveThreatList())
14702 return;
14703
14704 Creature* creature = ToCreature();
14705
14706 if (creature->HasReactState(REACT_PASSIVE))
14707 return;
14708
14709 Unit* target = GetVictim();
14710 if (!target || target != taunter)
14711 return;
14712
14714 {
14715 if (creature->IsAIEnabled)
14717 return;
14718 }
14719
14720 target = creature->SelectVictim(); // might have more taunt auras remaining
14721
14722 if (target && target != taunter)
14723 {
14725 SetInFront(target);
14726 if (creature->IsAIEnabled)
14727 creature->AI()->AttackStart(target);
14728 }
14729}
@ EVADE_REASON_NO_HOSTILES
Definition: CreatureAI.h:89
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
Definition: CreatureAI.cpp:208
bool isThreatListEmpty() const
Definition: ThreatMgr.h:224
Unit * SelectVictim()
Definition: Unit.cpp:14733

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), CreatureAI::EnterEvadeMode(), CreatureAI::EVADE_REASON_NO_HOSTILES, Object::GetGUID(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), Player::IsGameMaster(), Object::IsPlayer(), ThreatMgr::isThreatListEmpty(), m_ThreatMgr, REACT_PASSIVE, Creature::SelectVictim(), Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ TextEmote() [1/2]

◆ TextEmote() [2/2]

void Unit::TextEmote ( uint32  textId,
WorldObject const *  target = nullptr,
bool  isBossEmote = false 
)
virtual

Reimplemented in Player.

21209{
21210 Talk(textId, isBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target);
21211}

References CHAT_MSG_MONSTER_EMOTE, CHAT_MSG_RAID_BOSS_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, and sWorld.

◆ ToPet()

◆ ToTempSummon() [1/2]

TempSummon * Unit::ToTempSummon ( )
inline
696{ if (IsSummon()) return reinterpret_cast<TempSummon*>(this); else return nullptr; }

References IsSummon().

Referenced by CreatureAI::_EnterEvadeMode(), _ExitVehicle(), npc_living_mojo::npc_living_mojoAI::AttackStart(), WorldObject::CanSeeOrDetect(), Spell::CheckCast(), Spell::CheckEffectTarget(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), Creature::DespawnOnEvade(), Creature::DespawnOrUnsummon(), npc_bone_spike::npc_bone_spikeAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), ThreatMgr::DoAddThreat(), Spell::EffectScriptEffect(), npc_phantom_hallucination::npc_phantom_hallucinationAI::EnterEvadeMode(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::EnterEvadeMode(), SuckBackEvent::Execute(), npc_raging_flames::FixateRandomTarget(), boss_headless_horseman_head::GetOwner(), GetSpellModOwner(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::GetSummoner(), CreatureAI::GetSummoner(), Creature::GetSummonerGUID(), SmartScript::GetTargets(), WorldSession::HandleDismissCritter(), spell_pilgrims_bounty_pass_generic::HandleDummy(), WorldSession::HandlePetActionHelper(), spell_pri_lightwell::HandleScriptEffect(), spell_q11026_a11051_banish_the_demons::HandleScriptEffect(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), npc_pet_gen_imp_in_a_bottle::InitializeAI(), npc_pet_pri_lightwell::InitializeAI(), TempSummon::InitStats(), SpellClickInfo::IsFitToRequirements(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::JustDied(), boss_black_knight::boss_black_knightAI::JustDied(), boss_tyrannus::boss_tyrannusAI::JustDied(), npc_raging_spirit::npc_raging_spiritAI::JustDied(), boss_freya_iron_root::boss_freya_iron_rootAI::JustDied(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::JustDied(), npc_counselor_talbot::npc_counselor_talbotAI::JustDied(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), npc_pet_dk_ghoul::npc_pet_dk_ghoulAI::JustDied(), npc_pet_pri_shadowfiend::JustDied(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::JustEngagedWith(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::JustEngagedWith(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::JustSummoned(), npc_frosthound::npc_frosthoundAI::JustSummoned(), boss_halion::boss_halionAI::JustSummoned(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), npc_collapsing_star::npc_collapsing_starAI::JustSummoned(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::JustSummoned(), boss_supremus::JustSummoned(), Kill(), npc_tiger_matriarch::npc_tiger_matriarchAI::KilledUnit(), npc_netherspite_infernal::KilledUnit(), npc_living_mojo::npc_living_mojoAI::MoveInLineOfSight(), WaypointMovementGenerator< Creature >::MovementInform(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::MovementInform(), npc_leryssa::npc_leryssaAI::MovementInform(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::MovementInform(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::MovementInform(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), npc_claw_tentacle::npc_claw_tentacle(), npc_eye_tentacle::npc_eye_tentacle(), npc_giant_claw_tentacle::npc_giant_claw_tentacle(), npc_giant_eye_tentacle::npc_giant_eye_tentacle(), npc_midsummer_bonfire::npc_midsummer_bonfire(), npc_midsummer_ribbon_pole_target::npc_midsummer_ribbon_pole_target(), npc_pet_gen_soul_trader_beacon::npc_pet_gen_soul_trader_beacon(), BattlefieldWG::OnCreatureCreate(), instance_blackwing_lair::instance_blackwing_lair_InstanceMapScript::OnCreatureCreate(), npc_wormhole::OnGossipHello(), RemoveAllControlled(), RemoveAllMinionsByEntry(), spell_gen_defend::RemoveDummyFromDriver(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::Reset(), npc_raging_spirit::npc_raging_spiritAI::Reset(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_plaguehound_tracker::npc_plaguehound_trackerAI::Reset(), npc_voidtraveler::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Spell::SelectImplicitCasterObjectTargets(), Creature::SelectVictim(), Spell::SendSpellGo(), Spell::SendSpellStart(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_pilgrims_bounty_plate::SpellHit(), boss_the_lich_king::boss_the_lich_kingAI::SummonedCreatureDies(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::Update(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_love_in_air_snivel_real::UpdateAI(), npc_tiger_matriarch_credit::npc_tiger_matriarch_creditAI::UpdateAI(), npc_tiger_matriarch::npc_tiger_matriarchAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), npc_bone_spike::npc_bone_spikeAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_freya_ward::npc_freya_wardAI::UpdateAI(), npc_ulduar_flash_freeze::npc_ulduar_flash_freezeAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_captured_beryl_sorcerer::npc_captured_beryl_sorcererAI::UpdateAI(), npc_feedin_da_goolz::npc_feedin_da_goolzAI::UpdateAI(), Player::VehicleSpellInitialize(), and npc_frosthound::npc_frosthoundAI::WaypointReached().

◆ ToTempSummon() [2/2]

const TempSummon * Unit::ToTempSummon ( ) const
inline
697{ if (IsSummon()) return reinterpret_cast<const TempSummon*>(this); else return nullptr; }

References IsSummon().

◆ ToTotem()

Totem * Unit::ToTotem ( )
inline
695{ if (IsTotem()) return reinterpret_cast<Totem*>(this); else return nullptr; }
Definition: Totem.h:51

References IsTotem().

Referenced by _UnapplyAura(), Spell::EffectDestroyAllTotems(), WorldSession::HandleTotemDestroyed(), SetMinion(), Spell::SummonGuardian(), and TotemAI::UpdateAI().

◆ TriggerAurasProcOnEvent() [1/3]

void Unit::TriggerAurasProcOnEvent ( CalcDamageInfo damageInfo)
16545{
16546 DamageInfo dmgInfo = DamageInfo(damageInfo);
16547 TriggerAurasProcOnEvent(nullptr, nullptr, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, 0, 0, damageInfo.procEx, nullptr, &dmgInfo, nullptr);
16548}
void TriggerAurasProcOnEvent(CalcDamageInfo &damageInfo)
Definition: Unit.cpp:16544

References CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::target, and TriggerAurasProcOnEvent().

Referenced by TriggerAurasProcOnEvent().

◆ TriggerAurasProcOnEvent() [2/3]

void Unit::TriggerAurasProcOnEvent ( ProcEventInfo eventInfo,
std::list< AuraApplication * > &  procAuras 
)
16570{
16571 for (std::list<AuraApplication*>::iterator itr = aurasTriggeringProc.begin(); itr != aurasTriggeringProc.end(); ++itr)
16572 {
16573 if (!(*itr)->GetRemoveMode())
16574 (*itr)->GetBase()->TriggerProcOnEvent(*itr, eventInfo);
16575 }
16576}

◆ TriggerAurasProcOnEvent() [3/3]

void Unit::TriggerAurasProcOnEvent ( std::list< AuraApplication * > *  myProcAuras,
std::list< AuraApplication * > *  targetProcAuras,
Unit actionTarget,
uint32  typeMaskActor,
uint32  typeMaskActionTarget,
uint32  spellTypeMask,
uint32  spellPhaseMask,
uint32  hitMask,
Spell spell,
DamageInfo damageInfo,
HealInfo healInfo 
)
16551{
16552 // prepare data for self trigger
16553 ProcEventInfo myProcEventInfo = ProcEventInfo(this, actionTarget, actionTarget, typeMaskActor, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16554 std::list<AuraApplication*> myAurasTriggeringProc;
16555 GetProcAurasTriggeredOnEvent(myAurasTriggeringProc, myProcAuras, myProcEventInfo);
16556
16557 // prepare data for target trigger
16558 ProcEventInfo targetProcEventInfo = ProcEventInfo(this, actionTarget, this, typeMaskActionTarget, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16559 std::list<AuraApplication*> targetAurasTriggeringProc;
16560 if (typeMaskActionTarget)
16561 GetProcAurasTriggeredOnEvent(targetAurasTriggeringProc, targetProcAuras, targetProcEventInfo);
16562
16563 TriggerAurasProcOnEvent(myProcEventInfo, myAurasTriggeringProc);
16564
16565 if (typeMaskActionTarget)
16566 TriggerAurasProcOnEvent(targetProcEventInfo, targetAurasTriggeringProc);
16567}
void GetProcAurasTriggeredOnEvent(std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
Definition: Unit.cpp:16514

References GetProcAurasTriggeredOnEvent(), and TriggerAurasProcOnEvent().

◆ UnsummonAllTotems()

void Unit::UnsummonAllTotems ( bool  onDeath = false)
11206{
11207 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
11208 {
11209 if (!m_SummonSlot[i])
11210 {
11211 continue;
11212 }
11213
11214 if (Creature* OldTotem = GetMap()->GetCreature(m_SummonSlot[i]))
11215 {
11216 if (OldTotem->IsSummon())
11217 {
11218 if (!(onDeath && !IsPlayer() && OldTotem->IsGuardian()))
11219 {
11220 OldTotem->ToTempSummon()->UnSummon();
11221 }
11222 }
11223 }
11224 }
11225}

References WorldObject::GetMap(), Object::IsPlayer(), m_SummonSlot, and MAX_SUMMON_SLOT.

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ Update()

void Unit::Update ( uint32  time)
overridevirtual

Reimplemented from WorldObject.

383{
384 sScriptMgr->OnUnitUpdate(this, p_time);
385
386 // WARNING! Order of execution here is important, do not change.
387 // Spells must be processed with event system BEFORE they go to _UpdateSpells.
388 // Or else we may have some SPELL_STATE_FINISHED spells stalled in pointers, that is bad.
389 m_Events.Update(p_time);
390
391 if (!IsInWorld())
392 return;
393
394 // pussywizard:
395 if (!IsPlayer() || (!ToPlayer()->IsBeingTeleported() && !bRequestForcedVisibilityUpdate))
396 {
398 {
400 {
402 //ExecuteDelayedUnitRelocationEvent();
404 }
405 else
407 }
409 {
410 if (m_delayed_unit_ai_notify_timer <= p_time)
411 {
414 }
415 else
417 }
418 }
419
420 _UpdateSpells( p_time );
421
422 if (CanHaveThreatList() && GetThreatMgr().isNeedUpdateToClient(p_time))
424
425 // update combat timer only for players and pets (only pets with PetAI)
427 {
428 // Check UNIT_STATE_MELEE_ATTACKING or UNIT_STATE_CHASE (without UNIT_STATE_FOLLOW in this case) so pets can reach far away
429 // targets without stopping half way there and running off.
430 // These flags are reset after target dies or another command is given.
432 {
433 // m_CombatTimer set at aura start and it will be freeze until aura removing
434 if (m_CombatTimer <= p_time)
436 else
437 m_CombatTimer -= p_time;
438 }
439 }
440
443 {
444 while (!extraAttacksTargets.empty())
445 {
446 auto itr = extraAttacksTargets.begin();
447 ObjectGuid targetGuid = itr->first;
448 uint32 count = itr->second;
449 extraAttacksTargets.erase(itr);
450 if (Unit* victim = ObjectAccessor::GetUnit(*this, targetGuid))
451 {
453 || victim->IsWithinMeleeRange(this))
454 {
455 HandleProcExtraAttackFor(victim, count);
456 }
457 }
458 }
460 }
461
462 // not implemented before 3.0.2
463 // xinef: if attack time > 0, reduce by diff
464 // if on next update, attack time < 0 assume player didnt attack - set to 0
465 bool suspendAttackTimer = false;
466 bool suspendRangedAttackTimer = false;
468 {
469 for (Spell* spell : m_currentSpells)
470 {
471 if (spell)
472 {
473 if (spell->GetSpellInfo()->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
474 {
475 if (spell->IsChannelActive())
476 {
477 suspendRangedAttackTimer = true;
478 }
479
480 suspendAttackTimer = true;
481 break;
482 }
483 }
484 }
485 }
486
487 if (!suspendAttackTimer)
488 {
489 if (int32 base_attack = getAttackTimer(BASE_ATTACK))
490 {
491 setAttackTimer(BASE_ATTACK, base_attack > 0 ? base_attack - (int32) p_time : 0);
492 }
493
494 if (int32 off_attack = getAttackTimer(OFF_ATTACK))
495 {
496 setAttackTimer(OFF_ATTACK, off_attack > 0 ? off_attack - (int32) p_time : 0);
497 }
498 }
499
500 if (!suspendRangedAttackTimer)
501 {
502 if (int32 ranged_attack = getAttackTimer(RANGED_ATTACK))
503 {
504 setAttackTimer(RANGED_ATTACK, ranged_attack > 0 ? ranged_attack - (int32)p_time : 0);
505 }
506 }
507
508 // update abilities available only for fraction of time
509 UpdateReactives(p_time);
510
514
515 UpdateSplineMovement(p_time);
516 GetMotionMaster()->UpdateMotion(p_time);
517
519}
@ AURA_STATE_HEALTH_ABOVE_75_PERCENT
Definition: SharedDefines.h:1315
bool IsEmpty() const
Definition: LinkedList.h:97
void Update(uint32 p_time)
Definition: EventProcessor.cpp:40
void _UpdateSpells(uint32 time)
Definition: Unit.cpp:3844
void UpdateSplineMovement(uint32 t_diff)
Definition: Unit.cpp:575
void UpdateReactives(uint32 p_time)
Definition: Unit.cpp:16941
void ExecuteDelayedUnitAINotifyEvent()
Definition: Unit.cpp:20511
void HandleProcExtraAttackFor(Unit *victim, uint32 count)
Definition: Unit.cpp:2756
void SendThreatListUpdate()
Definition: Unit.cpp:20079
std::unordered_set< Unit * > i_objectsForDelayedVisibility
Definition: Map.h:387
void UpdateMotion(uint32 diff)
Definition: MotionMaster.cpp:104

References _lastDamagedTargetGuid, _lastExtraAttackSpell, _UpdateSpells(), AURA_STATE_HEALTH_ABOVE_75_PERCENT, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, bRequestForcedVisibilityUpdate, CanHaveThreatList(), ClearInCombat(), ObjectGuid::Empty, ExecuteDelayedUnitAINotifyEvent(), extraAttacksTargets, WorldObject::FindMap(), getAttackTimer(), GetMotionMaster(), GetThreatMgr(), ObjectAccessor::GetUnit(), HandleProcExtraAttackFor(), HasUnitState(), HasUnitTypeMask(), HealthAbovePct(), HealthBelowPct(), Map::i_objectsForDelayedVisibility, InvalidateValuesUpdateCache(), IsAlive(), IsControlledByPlayer(), LinkedListHead::IsEmpty(), IsInCombat(), Object::IsInWorld(), IsPet(), Object::IsPlayer(), m_CombatTimer, m_currentSpells, m_delayed_unit_ai_notify_timer, m_delayed_unit_relocation_timer, m_Events, m_HostileRefMgr, ModifyAuraState(), OFF_ATTACK, RANGED_ATTACK, SendThreatListUpdate(), setAttackTimer(), SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_HACK_AND_SLASH, SPELL_SWORD_SPECIALIZATION, sScriptMgr, Object::ToPlayer(), UNIT_MASK_CONTROLABLE_GUARDIAN, UNIT_STATE_CASTING, EventProcessor::Update(), MotionMaster::UpdateMotion(), UpdateReactives(), and UpdateSplineMovement().

Referenced by Creature::Update(), and Player::Update().

◆ UpdateAllResistances()

void Unit::UpdateAllResistances ( )
virtual

◆ UpdateAllStats()

virtual bool Unit::UpdateAllStats ( )
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

◆ UpdateArmor()

virtual void Unit::UpdateArmor ( )
pure virtual

◆ UpdateAttackPowerAndDamage()

virtual void Unit::UpdateAttackPowerAndDamage ( bool  ranged = false)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateAuraForGroup()

void Unit::UpdateAuraForGroup ( uint8  slot)
17171{
17172 if (slot >= MAX_AURAS) // slot not found, return
17173 return;
17174 if (Player* player = ToPlayer())
17175 {
17176 if (player->GetGroup())
17177 {
17178 player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_AURAS);
17179 player->SetAuraUpdateMaskForRaid(slot);
17180 }
17181 }
17182 else if (IsCreature() && IsPet())
17183 {
17184 Pet* pet = ((Pet*)this);
17185 if (pet->isControlled())
17186 {
17187 Unit* owner = GetOwner();
17188 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
17189 {
17191 pet->SetAuraUpdateMaskForRaid(slot);
17192 }
17193 }
17194 }
17195}
#define MAX_AURAS
Definition: SpellAuraDefines.h:21
@ GROUP_UPDATE_FLAG_PET_AURAS
Definition: Group.h:118
@ GROUP_UPDATE_FLAG_AURAS
Definition: Group.h:109
void SetAuraUpdateMaskForRaid(uint8 slot)
Definition: Pet.h:137

References Player::GetGroup(), GetOwner(), GROUP_UPDATE_FLAG_AURAS, GROUP_UPDATE_FLAG_PET_AURAS, Pet::isControlled(), Object::IsCreature(), IsPet(), Object::IsPlayer(), MAX_AURAS, Pet::SetAuraUpdateMaskForRaid(), Player::SetGroupUpdateFlag(), and Object::ToPlayer().

Referenced by RemoveVisibleAura(), and SetVisibleAura().

◆ UpdateCharmAI()

void Unit::UpdateCharmAI ( )
15786{
15787 if (IsPlayer())
15788 return;
15789
15790 if (i_disabledAI) // disabled AI must be primary AI
15791 {
15792 if (!IsCharmed())
15793 {
15794 delete i_AI;
15796 i_disabledAI = nullptr;
15797 }
15798 }
15799 else
15800 {
15801 if (IsCharmed())
15802 {
15804 if (isPossessed() || IsVehicle())
15805 i_AI = new PossessedAI(ToCreature());
15806 else
15807 i_AI = new PetAI(ToCreature());
15808 }
15809 }
15810}
Definition: PassiveAI.h:37
Definition: PetAI.h:47

References i_AI, i_disabledAI, IsCharmed(), Object::IsPlayer(), isPossessed(), IsVehicle(), and Object::ToCreature().

Referenced by Creature::Update().

◆ UpdateDamagePhysical()

void Unit::UpdateDamagePhysical ( WeaponAttackType  attType)
virtual

Reimplemented in Guardian, and Totem.

61{
62 float totalMin = 0.f;
63 float totalMax = 0.f;
64
65 float tmpMin, tmpMax;
66 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
67 {
68 CalculateMinMaxDamage(attType, false, true, tmpMin, tmpMax, i);
69 totalMin += tmpMin;
70 totalMax += tmpMax;
71 }
72
73 switch (attType)
74 {
75 case BASE_ATTACK:
76 default:
79 break;
80 case OFF_ATTACK:
83 break;
84 case RANGED_ATTACK:
87 break;
88 }
89}
void SetStatFloatValue(uint16 index, float value)
Definition: Object.cpp:790

References BASE_ATTACK, CalculateMinMaxDamage(), MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, RANGED_ATTACK, Object::SetStatFloatValue(), UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, and UNIT_FIELD_MINRANGEDDAMAGE.

Referenced by Player::_ApplyAmmoBonuses(), Player::_ApplyWeaponDamage(), boss_twin_valkyrAI::boss_twin_valkyrAI(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleModAttackSpeed(), HandleStatModifier(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::npc_toc_enh_shamanAI(), Player::RemoveAmmo(), Creature::SetCanDualWield(), ScriptedAI::SetEquipmentSlots(), Creature::UpdateAttackPowerAndDamage(), and Player::UpdateAttackPowerAndDamage().

◆ UpdateHeight()

void Unit::UpdateHeight ( float  newZ)

Only server-side height update, does not broadcast to client.

20073{
20075 if (IsVehicle())
20077}
void RelocatePassengers()
Definition: Vehicle.cpp:513

References Position::GetPositionX(), Position::GetPositionY(), GetVehicleKit(), IsVehicle(), Position::Relocate(), and Vehicle::RelocatePassengers().

Referenced by npc_dancing_flames::npc_dancing_flamesAI::Reset(), and SetHover().

◆ UpdateInterruptMask()

void Unit::UpdateInterruptMask ( )
755{
756 m_interruptMask = 0;
757 for (AuraApplicationList::const_iterator i = m_interruptableAuras.begin(); i != m_interruptableAuras.end(); ++i)
758 m_interruptMask |= (*i)->GetBase()->GetSpellInfo()->AuraInterruptFlags;
759
761 if (spell->getState() == SPELL_STATE_CASTING)
762 m_interruptMask |= spell->m_spellInfo->ChannelInterruptFlags;
763}

References CURRENT_CHANNELED_SPELL, m_currentSpells, m_interruptableAuras, m_interruptMask, and SPELL_STATE_CASTING.

Referenced by _UnapplyAura(), Spell::finish(), and RemoveAurasWithInterruptFlags().

◆ UpdateMaxHealth()

virtual void Unit::UpdateMaxHealth ( )
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateMaxPower()

virtual void Unit::UpdateMaxPower ( Powers  power)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateObjectVisibility()

◆ UpdateOrientation()

void Unit::UpdateOrientation ( float  orientation)

Only server-side orientation update, does not broadcast to client.

20065{
20066 SetOrientation(orientation);
20067 if (IsVehicle())
20069}

References GetVehicleKit(), IsVehicle(), Vehicle::RelocatePassengers(), and Position::SetOrientation().

Referenced by Spell::UpdateChanneledTargetList(), and UpdatePosition().

◆ UpdatePosition() [1/2]

bool Unit::UpdatePosition ( const Position pos,
bool  teleport = false 
)
inline

◆ UpdatePosition() [2/2]

bool Unit::UpdatePosition ( float  x,
float  y,
float  z,
float  ang,
bool  teleport = false 
)
virtual

Reimplemented in Player.

20027{
20028 if (!Acore::IsValidMapCoord(x, y, z, orientation))
20029 return false;
20030
20031 float old_orientation = GetOrientation();
20032 float current_z = GetPositionZ();
20033 bool turn = (old_orientation != orientation);
20034 bool relocated = (teleport || GetPositionX() != x || GetPositionY() != y || current_z != z);
20035
20036 if (!GetVehicle())
20037 {
20038 uint32 mask = 0;
20039 if (turn) mask |= AURA_INTERRUPT_FLAG_TURNING;
20040 if (relocated) mask |= AURA_INTERRUPT_FLAG_MOVE;
20041 if (mask)
20043 }
20044
20045 if (relocated)
20046 {
20047 if (IsPlayer())
20048 GetMap()->PlayerRelocation(ToPlayer(), x, y, z, orientation);
20049 else
20050 GetMap()->CreatureRelocation(ToCreature(), x, y, z, orientation);
20051 }
20052 else if (turn)
20053 {
20054 UpdateOrientation(orientation);
20055
20056 if (IsPlayer() && ToPlayer()->GetFarSightDistance())
20058 }
20059
20060 return (relocated || turn);
20061}
bool IsValidMapCoord(float c)
Definition: GridDefines.h:215
void UpdateOrientation(float orientation)
Only server-side orientation update, does not broadcast to client.
Definition: Unit.cpp:20064
void PlayerRelocation(Player *, float x, float y, float z, float o)
Definition: Map.cpp:1003
void CreatureRelocation(Creature *creature, float x, float y, float z, float o)
Definition: Map.cpp:1025

References AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, Map::CreatureRelocation(), WorldObject::GetMap(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetVehicle(), Object::IsPlayer(), Acore::IsValidMapCoord(), Map::PlayerRelocation(), RemoveAurasWithInterruptFlags(), Object::ToCreature(), Object::ToPlayer(), UpdateObjectVisibility(), and UpdateOrientation().

Referenced by npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_taldaram::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleMoveRootAck(), WorldSession::HandleMoveUnRootAck(), boss_flame_leviathan::boss_flame_leviathanAI::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_cyanigosa::boss_cyanigosaAI::JustDied(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_harbinger_skyriss::JustSummoned(), boss_icehowl::boss_icehowlAI::MovementInform(), NearTeleportTo(), npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Reposition(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Reposition(), boss_skadi::boss_skadiAI::Reset(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_escortAI::SetNextWaypoint(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), Player::UpdatePosition(), and UpdateSplinePosition().

◆ UpdateReactives()

void Unit::UpdateReactives ( uint32  p_time)
16942{
16943 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
16944 {
16945 ReactiveType reactive = ReactiveType(i);
16946
16947 if (!m_reactiveTimer[reactive])
16948 continue;
16949
16950 if (m_reactiveTimer[reactive] <= p_time)
16951 {
16952 m_reactiveTimer[reactive] = 0;
16953
16954 switch (reactive)
16955 {
16956 case REACTIVE_DEFENSE:
16959 break;
16963 break;
16964 case REACTIVE_OVERPOWER:
16966 {
16968 }
16969 break;
16971 if (IsHunterPet())
16973 break;
16974 default:
16975 break;
16976 }
16977 }
16978 else
16979 {
16980 m_reactiveTimer[reactive] -= p_time;
16981 }
16982 }
16983}
ReactiveType
Definition: Unit.h:587

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), HasAuraState(), IsClass(), IsHunterPet(), m_reactiveTimer, MAX_REACTIVE, ModifyAuraState(), REACTIVE_DEFENSE, REACTIVE_HUNTER_PARRY, REACTIVE_OVERPOWER, and REACTIVE_WOLVERINE_BITE.

Referenced by Update().

◆ UpdateResistances()

virtual void Unit::UpdateResistances ( uint32  school)
pure virtual

Implemented in Creature, Player, and Totem.

Referenced by HandleStatModifier(), and UpdateAllResistances().

◆ UpdateSpeed()

void Unit::UpdateSpeed ( UnitMoveType  mtype,
bool  forced 
)
Todo:
possible affect only on MOVE_RUN
14251{
14252 int32 main_speed_mod = 0;
14253 float stack_bonus = 1.0f;
14254 float non_stack_bonus = 1.0f;
14255
14256 switch (mtype)
14257 {
14258 // Only apply debuffs
14259 case MOVE_FLIGHT_BACK:
14260 case MOVE_RUN_BACK:
14261 case MOVE_SWIM_BACK:
14262 case MOVE_WALK:
14263 break;
14264 case MOVE_RUN:
14265 {
14266 if (IsMounted()) // Use on mount auras
14267 {
14271 }
14272 else
14273 {
14277 }
14278 break;
14279 }
14280 case MOVE_SWIM:
14281 {
14282 // xinef: check for forced_speed_mod of sea turtle
14284 for (Unit::AuraEffectList::const_iterator itr = swimAuras.begin(); itr != swimAuras.end(); ++itr)
14285 {
14286 // xinef: sea turtle only, it is not affected by any increasing / decreasing effects
14287 if ((*itr)->GetId() == 64731 /*SPELL_SEA_TURTLE*/)
14288 {
14289 SetSpeed(mtype, AddPct(non_stack_bonus, (*itr)->GetAmount()), forced);
14290 return;
14291 }
14292 else if (
14293 // case: increase speed
14294 ((*itr)->GetAmount() > 0 && (*itr)->GetAmount() > main_speed_mod) ||
14295 // case: decrease speed
14296 ((*itr)->GetAmount() < 0 && (*itr)->GetAmount() < main_speed_mod)
14297 )
14298 {
14299 main_speed_mod = (*itr)->GetAmount();
14300 }
14301 }
14302 break;
14303 }
14304 case MOVE_FLIGHT:
14305 {
14306 if (IsCreature() && IsControlledByPlayer()) // not sure if good for pet
14307 {
14310
14311 // for some spells this mod is applied on vehicle owner
14312 int32 owner_speed_mod = 0;
14313
14314 if (Unit* owner = GetCharmer())
14315 owner_speed_mod = owner->GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED);
14316
14317 main_speed_mod = std::max(main_speed_mod, owner_speed_mod);
14318 }
14319 else if (IsMounted())
14320 {
14324 }
14325 else // Use not mount (shapeshift for example) auras (should stack)
14326 {
14330 }
14331
14332 // Update speed for vehicle if available
14333 if (IsPlayer() && GetVehicle())
14335 break;
14336 }
14337 default:
14338 LOG_ERROR("entities.unit", "Unit::UpdateSpeed: Unsupported move type ({})", mtype);
14339 return;
14340 }
14341
14342 // now we ready for speed calculation
14343 float speed = std::max(non_stack_bonus, stack_bonus);
14344 if (main_speed_mod)
14345 AddPct(speed, main_speed_mod);
14346
14347 switch (mtype)
14348 {
14349 case MOVE_RUN:
14350 case MOVE_SWIM:
14351 case MOVE_FLIGHT:
14352 {
14353 // Set creature speed rate
14354 if (IsCreature())
14355 {
14356 if (IsPet() && ToPet()->isControlled() && IsControlledByPlayer())
14357 {
14358 // contant value for player pets
14359 speed *= 1.15f;
14360 }
14361 else
14362 {
14363 speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached
14364 }
14365 }
14366
14367 // Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need
14370 {
14371 if (Creature* creature = ToCreature())
14372 {
14373 uint32 immuneMask = creature->GetCreatureTemplate()->MechanicImmuneMask;
14374 if (immuneMask & (1 << (MECHANIC_SNARE - 1)) || immuneMask & (1 << (MECHANIC_DAZE - 1)))
14375 break;
14376 }
14377
14378 // Use speed from aura
14379 float max_speed = normalization / (IsControlledByPlayer() ? playerBaseMoveSpeed[mtype] : baseMoveSpeed[mtype]);
14380 if (speed > max_speed)
14381 speed = max_speed;
14382 }
14383 break;
14384 }
14385 default:
14386 break;
14387 }
14388
14389 int32 slowFromHealth = 0;
14390 Creature* creature = ToCreature();
14391 // ignore pets, player owned vehicles, and mobs immune to snare
14392 if (creature
14393 && !IsPet()
14394 && !(IsControlledByPlayer() && IsVehicle())
14396 && !(creature->IsDungeonBoss()))
14397 {
14398 // 1.6% for each % under 30.
14399 // use min(0, health-30) so that we don't boost mobs above 30.
14400 slowFromHealth = (int32) std::min(0.0f, (1.66f * (GetHealthPct() - 30.0f)));
14401 }
14402
14403 if (slowFromHealth)
14404 {
14405 AddPct(speed, slowFromHealth);
14406 }
14407
14408 // Apply strongest slow aura mod to speed
14410 if (slow)
14411 AddPct(speed, slow);
14412
14413 if (float minSpeedMod = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MINIMUM_SPEED))
14414 {
14415 float base_speed = (IsCreature() ? ToCreature()->GetCreatureTemplate()->speed_run : 1.0f);
14416 float min_speed = base_speed * (minSpeedMod / 100.0f);
14417 if (speed < min_speed)
14418 speed = min_speed;
14419 }
14420
14421 SetSpeed(mtype, speed, forced);
14422}
@ MECHANIC_DAZE
Definition: SharedDefines.h:1352
@ SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED
Definition: SpellAuraDefines.h:269
@ SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS
Definition: SpellAuraDefines.h:272
@ SPELL_AURA_MOD_INCREASE_SPEED
Definition: SpellAuraDefines.h:94
@ SPELL_AURA_MOD_FLIGHT_SPEED_ALWAYS
Definition: SpellAuraDefines.h:271
@ SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK
Definition: SpellAuraDefines.h:235
@ SPELL_AURA_MOD_SPEED_NOT_STACK
Definition: SpellAuraDefines.h:234
@ SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING
Definition: SpellAuraDefines.h:273
@ SPELL_AURA_MOD_INCREASE_SWIM_SPEED
Definition: SpellAuraDefines.h:121
@ SPELL_AURA_MOD_MINIMUM_SPEED
Definition: SpellAuraDefines.h:368
@ SPELL_AURA_MOD_SPEED_ALWAYS
Definition: SpellAuraDefines.h:192
@ SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING
Definition: SpellAuraDefines.h:274
@ SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS
Definition: SpellAuraDefines.h:193
@ SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED
Definition: SpellAuraDefines.h:254
float speed_run
Definition: CreatureData.h:201
void SetSpeed(UnitMoveType mtype, float rate, bool forced=false)
Definition: Unit.cpp:14429

References AddPct(), baseMoveSpeed, GetAuraEffectsByType(), GetCharmer(), Creature::GetCreatureTemplate(), GetHealthPct(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), GetTotalAuraModifier(), GetTotalAuraMultiplier(), GetVehicle(), GetVehicleBase(), Creature::HasMechanicTemplateImmunity(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsDungeonBoss(), IsMounted(), IsPet(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, MECHANIC_DAZE, MECHANIC_SNARE, MOVE_FLIGHT, MOVE_FLIGHT_BACK, MOVE_RUN, MOVE_RUN_BACK, MOVE_SWIM, MOVE_SWIM_BACK, MOVE_WALK, playerBaseMoveSpeed, SetSpeed(), CreatureTemplate::speed_run, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_FLIGHT_SPEED_ALWAYS, SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING, SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING, SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED, SPELL_AURA_MOD_INCREASE_SPEED, SPELL_AURA_MOD_INCREASE_SWIM_SPEED, SPELL_AURA_MOD_MINIMUM_SPEED, SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS, SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS, SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK, SPELL_AURA_MOD_SPEED_ALWAYS, SPELL_AURA_MOD_SPEED_NOT_STACK, SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED, Object::ToCreature(), ToPet(), and UpdateSpeed().

Referenced by Creature::DoFleeToGetAssistance(), AuraEffect::HandleAuraModDecreaseSpeed(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModIncreaseSpeed(), AuraEffect::HandleAuraModIncreaseSwimSpeed(), AuraEffect::HandleAuraModUseNormalSpeed(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), RemoveCharmedBy(), SetHealth(), SetInCombatState(), SetSpeed(), and UpdateSpeed().

◆ UpdateSplineMovement()

void Unit::UpdateSplineMovement ( uint32  t_diff)
private
576{
577 if (movespline->Finalized())
578 return;
579
580 // xinef: process movementinform
581 // this code cant be placed inside EscortMovementGenerator, because we cant delete active MoveGen while it is updated
582 SplineHandler handler(this);
583 movespline->updateState(t_diff, handler);
584 // Xinef: Spline was cleared by StopMoving, return
585 if (!movespline->Initialized())
586 {
588 return;
589 }
590
591 bool arrived = movespline->Finalized();
592
593 if (arrived)
594 {
596
597 if (movespline->HasAnimation() && IsCreature() && IsAlive())
599 }
600
601 // pussywizard: update always! not every 400ms, because movement generators need the actual position
602 //m_movesplineTimer.Update(t_diff);
603 //if (m_movesplineTimer.Passed() || arrived)
605}
@ UNIT_BYTES_1_OFFSET_ANIM_TIER
Definition: UnitDefines.h:26
Definition: Unit.cpp:555
uint8 GetAnimationType() const
Definition: MoveSpline.h:125
void updateState(int32 difftime, UpdateHandler &handler)
Definition: MoveSpline.h:98
bool HasAnimation() const
Definition: MoveSpline.h:124

References DisableSpline(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::GetAnimationType(), Movement::MoveSpline::HasAnimation(), Movement::MoveSpline::Initialized(), IsAlive(), Object::IsCreature(), movespline, Object::SetByteValue(), UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_FIELD_BYTES_1, UpdateSplinePosition(), and Movement::MoveSpline::updateState().

Referenced by Update().

◆ UpdateSplinePosition()

void Unit::UpdateSplinePosition ( )
private
608{
609 //static uint32 const positionUpdateDelay = 400;
610
611 //m_movesplineTimer.Reset(positionUpdateDelay);
613
615 {
617 pos.m_positionX = loc.x;
618 pos.m_positionY = loc.y;
619 pos.m_positionZ = loc.z;
621
622 if (TransportBase* transport = GetDirectTransport())
623 transport->CalculatePassengerPosition(loc.x, loc.y, loc.z, &loc.orientation);
624 }
625
626 // Xinef: if we had spline running update orientation along with position
627 //if (HasUnitState(UNIT_STATE_CANNOT_TURN))
628 // loc.orientation = GetOrientation();
629
630 if (IsPlayer())
631 UpdatePosition(loc.x, loc.y, loc.z, loc.orientation);
632 else
633 ToCreature()->SetPosition(loc.x, loc.y, loc.z, loc.orientation);
634}
void SetPosition(float x, float y, float z, float o)
Definition: Creature.cpp:3154
Position pos
Definition: Object.h:297
float m_positionZ
Definition: Position.h:57
float m_positionX
Definition: Position.h:55
float m_positionY
Definition: Position.h:56
TransportBase * GetDirectTransport() const
Definition: Unit.cpp:18768
Definition: VehicleDefines.h:130
Definition: MoveSpline.h:27
float orientation
Definition: MoveSpline.h:33
Location ComputePosition() const
Definition: MoveSpline.cpp:26
bool onTransport
Definition: MoveSpline.h:127

References Movement::MoveSpline::ComputePosition(), GetDirectTransport(), Object::IsPlayer(), WorldObject::m_movementInfo, Position::m_positionX, Position::m_positionY, Position::m_positionZ, movespline, Movement::MoveSpline::onTransport, Movement::Location::orientation, MovementInfo::TransportInfo::pos, Position::SetOrientation(), Creature::SetPosition(), Object::ToCreature(), MovementInfo::transport, and UpdatePosition().

Referenced by StopMoving(), and UpdateSplineMovement().

◆ UpdateStats()

virtual bool Unit::UpdateStats ( Stats  stat)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ Whisper() [1/2]

void Unit::Whisper ( std::string_view  text,
Language  language,
Player target,
bool  isBossWhisper = false 
)
virtual

Reimplemented in Player.

21156{
21157 if (!target)
21158 {
21159 return;
21160 }
21161
21163 WorldPacket data;
21164 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, language, this, target, text, 0, "", locale);
21165 target->SendDirectMessage(&data);
21166}
LocaleConstant
Definition: Common.h:65
@ CHAT_MSG_MONSTER_WHISPER
Definition: SharedDefines.h:3167
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition: SharedDefines.h:3194
static std::size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="")
Definition: Chat.cpp:264
LocaleConstant GetSessionDbLocaleIndex() const
Definition: WorldSession.h:498

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), and Player::SendDirectMessage().

Referenced by npc_commandscript::HandleNpcWhisperCommand(), spell_lich_king_whisper::HandleScript(), Map::ScriptsProcess(), and boss_zuramat::boss_zuramatAI::UpdateAI().

◆ Whisper() [2/2]

void Unit::Whisper ( uint32  textId,
Player target,
bool  isBossWhisper = false 
)
virtual

Reimplemented in Player.

21214{
21215 if (!target)
21216 {
21217 return;
21218 }
21219
21220 BroadcastText const* bct = sObjectMgr->GetBroadcastText(textId);
21221 if (!bct)
21222 {
21223 LOG_ERROR("entities.unit", "Unit::Whisper: `broadcast_text` was not {} found", textId);
21224 return;
21225 }
21226
21228 WorldPacket data;
21229 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
21230 target->SendDirectMessage(&data);
21231}
Definition: ObjectMgr.h:434
std::string const & GetText(LocaleConstant locale=DEFAULT_LOCALE, uint8 gender=GENDER_MALE, bool forceGender=false) const
Definition: ObjectMgr.h:456

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, getGender(), Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), BroadcastText::GetText(), LANG_UNIVERSAL, LOG_ERROR, Player::SendDirectMessage(), and sObjectMgr.

◆ Yell() [1/2]

void Unit::Yell ( std::string_view  text,
Language  language,
WorldObject const *  target = nullptr 
)
virtual

◆ Yell() [2/2]

void Unit::Yell ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21204{
21205 Talk(textId, CHAT_MSG_MONSTER_YELL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target);
21206}

References CHAT_MSG_MONSTER_YELL, CONFIG_LISTEN_RANGE_YELL, and sWorld.

Member Data Documentation

◆ _charmThreatInfo

CharmThreatMap Unit::_charmThreatInfo
protected

Referenced by RemoveCharmedBy().

◆ _instantCast

bool Unit::_instantCast
protected

◆ _isWalkingBeforeCharm

bool Unit::_isWalkingBeforeCharm
private

Are we walking before we were charmed?

Referenced by SetCharm(), and Unit().

◆ _lastDamagedTargetGuid

◆ _lastExtraAttackSpell

uint32 Unit::_lastExtraAttackSpell
private

◆ _lastLiquid

LiquidTypeEntry const* Unit::_lastLiquid
protected

◆ _oldFactionId

uint32 Unit::_oldFactionId
private

faction before charm

Referenced by GetOldFactionId(), RemoveCharmedBy(), SetCharmedBy(), and Unit().

◆ _redirectThreatInfo

◆ _valuesUpdateCache

ValuesUpdateCache Unit::_valuesUpdateCache
private

◆ bRequestForcedVisibilityUpdate

◆ extraAttacksTargets

std::unordered_map<ObjectGuid , uint32 > Unit::extraAttacksTargets
private

Referenced by AddExtraAttacks(), and Update().

◆ i_AI

◆ i_disabledAI

UnitAI* Unit::i_disabledAI
protected

Referenced by UpdateCharmAI().

◆ i_motionMaster

MotionMaster* Unit::i_motionMaster
protected

Referenced by GetMotionMaster(), and ~Unit().

◆ IsAIEnabled

◆ m_appliedAuras

◆ m_applyResilience

bool Unit::m_applyResilience
protected

◆ m_attackers

◆ m_attacking

Unit* Unit::m_attacking
protected

◆ m_attackTimer

◆ m_auraModifiersGroup

◆ m_auraStateAuras

◆ m_auraUpdateIterator

AuraMap::iterator Unit::m_auraUpdateIterator
protected

◆ m_AutoRepeatFirstCast

bool Unit::m_AutoRepeatFirstCast
protected

◆ m_baseSpellCritChance

◆ m_canDualWield

bool Unit::m_canDualWield

◆ m_canModifyStats

bool Unit::m_canModifyStats
protected

◆ m_charmInfo

◆ m_cleanupDone

bool Unit::m_cleanupDone
private

◆ m_CombatTimer

uint32 Unit::m_CombatTimer
private

◆ m_ComboPointHolders

std::unordered_set<Unit*> Unit::m_ComboPointHolders
private

◆ m_comboPoints

int8 Unit::m_comboPoints
private

◆ m_comboTarget

◆ m_Controlled

◆ m_ControlledByPlayer

bool Unit::m_ControlledByPlayer

◆ m_CreatedByPlayer

bool Unit::m_CreatedByPlayer

◆ m_createStats

float Unit::m_createStats[MAX_STATS]
protected

◆ m_currentSpells

◆ m_deathState

◆ m_delayed_unit_ai_notify_timer

uint16 Unit::m_delayed_unit_ai_notify_timer

Referenced by Unit(), and Update().

◆ m_delayed_unit_relocation_timer

uint16 Unit::m_delayed_unit_relocation_timer

Referenced by Unit(), Player::Update(), and Update().

◆ m_Diminishing

◆ m_duringRemoveFromWorld

bool Unit::m_duringRemoveFromWorld
private

◆ m_dynObj

◆ m_Events

EventProcessor Unit::m_Events

Referenced by _ExitVehicle(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Activate(), CharmInfo::AddSpellToActionBar(), Spell::AddUnitTarget(), spell_sindragosa_ice_tomb_trap_aura::AfterApply(), Creature::CallAssistance(), boss_high_nethermancer_zerevor::CastDampenMagicIfPossible(), CastDelayedSpellWithPeriodicAmount(), boss_murmur::CastSuppressionOOC(), CleanupBeforeRemoveFromMap(), boss_romulo::DamageTaken(), boss_muru::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), boss_julianne::DoAction(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::DoAction(), boss_akilzon::DoAction(), boss_cthun::DoAction(), boss_kalecgos::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), npc_maiev_illidan::DoAction(), npc_blade_of_azzinoth::DoAction(), boss_ouro::Emerge(), boss_illidan_stormrage::EnterEvadeMode(), boss_zuljin::EnterPhase(), SpellEvent::Execute(), BattleExperienceEvent::Execute(), UtherBatteredHiltEvent::Execute(), TriggerWickedSpirit::Execute(), lapseTeleport::Execute(), PartyTimeEmoteEvent::Execute(), npc_xt002_boombot::npc_xt002_boombotAI::Explode(), Creature::ForcedDespawn(), WorldSession::HandleAuctionListOwnerItems(), spell_item_party_time::HandleEffectApply(), spell_alar_flame_quills::HandlePeriodic(), WorldSession::HandlePlayerLoginFromDB(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), boss_akilzon::HandleStormSequence(), boss_kiljaeden::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), Totem::InitSummon(), npc_blade_of_azzinoth::IsSummonedBy(), npc_flame_of_azzinoth::IsSummonedBy(), npc_maiev_illidan::IsSummonedBy(), boss_akilzon::JustDied(), boss_zuljin::JustDied(), npc_swarm_scarab::npc_swarm_scarabAI::JustDied(), npc_nerubian_burrower::npc_nerubian_burrowerAI::JustDied(), npc_gunship::npc_gunshipAI::JustDied(), npc_xt002_boombot::npc_xt002_boombotAI::JustDied(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::JustDied(), boss_mother_shahraz::JustDied(), boss_najentus::JustDied(), boss_akilzon::JustEngagedWith(), boss_zuljin::JustEngagedWith(), boss_keleseth::JustEngagedWith(), npc_flame_of_azzinoth::JustEngagedWith(), boss_essence_of_suffering::boss_essence_of_sufferingAI::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_brutallus::JustEngagedWith(), boss_sacrolash::JustEngagedWith(), boss_alythess::JustEngagedWith(), boss_kalecgos::JustEngagedWith(), boss_muru::JustEngagedWith(), boss_janalai::JustEngagedWith(), boss_anubrekhan::boss_anubrekhanAI::JustEngagedWith(), boss_murmur::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_illidan_stormrage::JustEngagedWith(), boss_mother_shahraz::JustEngagedWith(), boss_najentus::JustEngagedWith(), boss_hydross_the_unstable::JustEngagedWith(), npc_akama_illidan::JustReachedHome(), boss_kiljaeden::JustSummoned(), boss_hazzarah::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_prince_valanar_icc::boss_prince_valanarAI::JustSummoned(), boss_sindragosa::boss_sindragosaAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::JustSummoned(), npc_risen_archmage::npc_risen_archmageAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::JustSummoned(), boss_gurtogg_bloodboil::KilledUnit(), boss_illidan_stormrage::KilledUnit(), boss_essence_of_suffering::boss_essence_of_sufferingAI::KilledUnit(), boss_essence_of_desire::boss_essence_of_desireAI::KilledUnit(), boss_essence_of_anger::boss_essence_of_angerAI::KilledUnit(), Creature::ModifyThreatPercentTemp(), boss_ebonroc::boss_ebonrocAI::MovementInform(), boss_zuljin::MovementInform(), boss_captain_skarloc::MovementInform(), boss_ayamiss::MovementInform(), boss_illidan_stormrage::MovementInform(), npc_akama_illidan::MovementInform(), boss_essence_of_suffering::boss_essence_of_sufferingAI::MovementInform(), boss_essence_of_desire::boss_essence_of_desireAI::MovementInform(), boss_felmyst::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), boss_ghazan::MovementInform(), spell_halion_twilight_realm_aura::OnApply(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), go_main_chambers_access_panel::OnGossipHello(), spell_halion_leave_twilight_realm_aura::OnRemove(), at_cthun_stomach_exit::OnTrigger(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnUnitDeath(), npc_hyldsmeet_protodrake::npc_hyldsmeet_protodrakeAI::PassengerBoarded(), boss_anetheron::PathEndReached(), boss_rage_winterchill::PathEndReached(), npc_hyjal_ground_trash::PathEndReached(), npc_hyjal_frost_wyrm::PathEndReached(), boss_ambassador_hellmaw::PathEndReached(), npc_akama_illidan::PathEndReached(), npc_hyjal_gargoyle::PathEndReached(), npc_hive_zara_swarmer::PathEndReached(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), Spell::prepare(), SmartScript::ProcessAction(), Spell::RecalculateDelayMomentForDst(), boss_brutallus::Reset(), boss_sacrolash::Reset(), boss_alythess::Reset(), boss_felmyst::Reset(), boss_kalec::Reset(), boss_kiljaeden::Reset(), boss_muru::Reset(), boss_entropius::Reset(), npc_singularity::Reset(), boss_akilzon::Reset(), boss_janalai::Reset(), boss_zuljin::Reset(), boss_anubrekhan::boss_anubrekhanAI::Reset(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::Reset(), boss_illidan_stormrage::Reset(), npc_akama_illidan::Reset(), npc_maiev_illidan::Reset(), boss_mother_shahraz::Reset(), boss_najentus::Reset(), boss_alar::Reset(), NPCStaveQuestAI::ResetState(), boss_alar::ScheduleAbilities(), boss_illidan_stormrage::ScheduleAbilities(), boss_felmyst::ScheduleFlightAbilities(), boss_felmyst::ScheduleFlightSequence(), npc_gunship_boarding_addAI::SetData(), boss_the_beast::boss_thebeastAI::SetData(), boss_felmyst::StartIntro(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::SummonedCreatureDies(), boss_hydross_the_unstable::SummonMovementInform(), boss_hydross_the_unstable::SummonTaintedElementalOOC(), CreatureAI::Talk(), TempSummon::UnSummon(), Totem::UnSummon(), spell_illidari_council_deadly_strike_aura::Update(), Update(), and boss_anomalus::UpdateAI().

◆ m_extraAttacks

uint32 Unit::m_extraAttacks

◆ m_FollowingRefMgr

FollowerRefMgr Unit::m_FollowingRefMgr
private

Referenced by addFollower().

◆ m_gameObj

◆ m_HostileRefMgr

HostileRefMgr Unit::m_HostileRefMgr
private

◆ m_interruptableAuras

◆ m_interruptMask

◆ m_last_notify_mstime

uint32 Unit::m_last_notify_mstime

◆ m_last_notify_position

◆ m_lastManaUse

uint32 Unit::m_lastManaUse
private

◆ m_lastSanctuaryTime

uint32 Unit::m_lastSanctuaryTime

◆ m_modAttackSpeedPct

◆ m_modAuras

◆ m_modMeleeHitChance

◆ m_modRangedHitChance

◆ m_modSpellHitChance

◆ m_movedByPlayer

◆ m_ObjectSlot

◆ m_ownedAuras

◆ m_petAuras

PetAuraSet Unit::m_petAuras

◆ m_procDeep

int32 Unit::m_procDeep
protected

Referenced by CanProc(), and SetCantProc().

◆ m_race

uint8 Unit::m_race
protected

◆ m_reactiveTimer

uint32 Unit::m_reactiveTimer[MAX_REACTIVE]
protected

◆ m_realRace

uint8 Unit::m_realRace
protected

◆ m_regenTimer

◆ m_removedAuras

AuraList Unit::m_removedAuras
protected

◆ m_removedAurasCount

uint32 Unit::m_removedAurasCount
protected

◆ m_rootTimes

uint32 Unit::m_rootTimes
protected

Referenced by SetRooted(), and Unit().

◆ m_scAuras

AuraList Unit::m_scAuras
protected

Referenced by GetSingleCastAuras().

◆ m_sharedVision

◆ m_speed_rate

float Unit::m_speed_rate[MAX_MOVE_TYPE]
protected

◆ m_spellImmune

◆ m_state

uint32 Unit::m_state
private

◆ m_SummonSlot

◆ m_ThreatMgr

◆ m_threatModifier

float Unit::m_threatModifier[MAX_SPELL_SCHOOL]

◆ m_transform

uint32 Unit::m_transform
protected

Referenced by getTransForm(), setTransForm(), and Unit().

◆ m_unitTypeMask

◆ m_vehicle

◆ m_vehicleKit

Vehicle* Unit::m_vehicleKit
protected

◆ m_visibleAuras

◆ m_weaponDamage

◆ movespline

◆ NeedChangeAI

bool Unit::NeedChangeAI

◆ SafeUnitPointerSet

std::set<SafeUnitPointer*> Unit::SafeUnitPointerSet